首頁 後端開發 php教程 php擴充開發筆記(6)ZVAL_STRING 和 ZVAL_STRINGL

php擴充開發筆記(6)ZVAL_STRING 和 ZVAL_STRINGL

Aug 08, 2016 am 09:22 AM
length string zend zval

字串處理是我們常用的操作,而zend 封裝了很多關於字串運算相關的宏,先看下ZVAL_STRING 和ZVAL_STRINGL

<code><span>#define ZVAL_STRING(z, s, duplicate) do {   \</span><span>const</span><span>char</span> *__s=(s);                \
         zval *__z = (z);                    \
         Z_STRLEN_P(__z) = <span>strlen</span>(__s);      \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(<span>char</span>*)__s);\
         Z_TYPE_P(__z) = IS_STRING;          \
     } <span>while</span> (<span>0</span>)

 <span>#define ZVAL_STRINGL(z, s, l, duplicate) do {   \</span><span>const</span><span>char</span> *__s=(s); <span>int</span> __l=l;         \
         zval *__z = (z);                        \
         Z_STRLEN_P(__z) = __l;                  \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(<span>char</span>*)__s);\
         Z_TYPE_P(__z) = IS_STRING;              \
     } <span>while</span> (<span>0</span>)</code>
登入後複製

因為php 內部很多字串運算(例如substr)最後都是給予這樣的宏來操作的,所以在這裡了解這兩個宏非常重要。

ZVAL_STRINGL 在處理的時候,因為給了 length 參數,所以不需要在使用 strlen 來求字串的長度了, 性能上有所提升。

前面在常用的zend api 裡面應該說過了,關於estrndup 也都是封裝了一層的,在php 擴展開發的時候,盡量使用系統封裝的函數,這樣可以優化內存,降低內存洩漏等風險,有幾個e* 開發的函數,可以看之前的相關文章。

estrndup 定義

<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>
登入後複製

_estrndup 定義

<code> ZEND_API <span>char</span> *_estrndup(<span>const</span><span>char</span> *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
     <span>char</span> *p;
 <span>#ifdef ZEND_SIGNALS</span>
     TSRMLS_FETCH();
 <span>#endif</span>     HANDLE_BLOCK_INTERRUPTIONS();

     p = (<span>char</span> *) _emalloc(length+<span>1</span> ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
     <span>if</span> (UNEXPECTED(p == NULL)) {
         HANDLE_UNBLOCK_INTERRUPTIONS();
         <span>return</span> p;
     }
     <span>memcpy</span>(p, s, length);
     p[length] = <span>0</span>;
     HANDLE_UNBLOCK_INTERRUPTIONS();
     <span>return</span> p;
 }</code>
登入後複製

可以自行搜尋關於 _emalloc 等相關函數定義。

以上就介紹了php擴充開發筆記(6)ZVAL_STRING 和 ZVAL_STRINGL,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用java的String.valueOf()函數將基本資料型別轉換為字串 使用java的String.valueOf()函數將基本資料型別轉換為字串 Jul 24, 2023 pm 07:55 PM

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

怎麼把char數組轉string 怎麼把char數組轉string Jun 09, 2023 am 10:04 AM

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

使用java的String.replace()函數替換字串中的字元(字串) 使用java的String.replace()函數替換字串中的字元(字串) Jul 25, 2023 pm 05:16 PM

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

2w字 詳解 String,yyds 2w字 詳解 String,yyds Aug 24, 2023 pm 03:56 PM

大家好,今天跟大家分享java基礎之String。 String類別的重要性就不必說了,可以說是我們後端開發用的最多的類,所以,很有必要好好聊聊它。

使用java的String.length()函數取得字串的長度 使用java的String.length()函數取得字串的長度 Jul 25, 2023 am 09:09 AM

使用Java的String.length()函數取得字串的長度在Java程式設計中,字串是一種非常常見的資料類型,我們經常需要取得字串的長度,即字串中字元的個數。在Java中,我們可以使用String類別的length()函數來取得字串的長度。下面是一個簡單的範例程式碼:publicclassStringLengthExample{publ

Golang函數的byte、rune和string型轉換技巧 Golang函數的byte、rune和string型轉換技巧 May 17, 2023 am 08:21 AM

在Golang程式設計中,byte、rune和string類型是非常基礎、常見的資料型別。它們在處理字串、檔案流等資料操作時發揮著重要作用。而在進行這些資料操作時,我們通常需要對它們進行相互的轉換,這就需要掌握一些轉換技巧。本文將介紹Golang函數的byte、rune和string類型轉換技巧,旨在幫助讀者更好地理解這些資料類型,並能夠熟練地在程式設計實踐中應用

如何在Zend框架中使用ACL(Access Control List)進行權限控制 如何在Zend框架中使用ACL(Access Control List)進行權限控制 Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)進行權限控制導言:在一個Web應用程式中,權限控制是至關重要的功能。它可以確保使用者只能存取其有權存取的頁面和功能,並防止未經授權的存取。 Zend框架提供了一種方便的方法來實現權限控制,即使用ACL(AccessControlList)元件。本文將介紹如何在Zend框架中使用ACL

PHP實作框架:Zend Framework入門教程 PHP實作框架:Zend Framework入門教程 Jun 19, 2023 am 08:09 AM

PHP實作框架:ZendFramework入門教學ZendFramework是PHP開發的開源網站框架,目前由ZendTechnologies維護,ZendFramework採用了MVC設計模式,提供了一系列可重複使用的程式碼庫,服務於實作Web2.0應用程式和Web服務。 ZendFramework深受PHP開發者的歡迎與推崇,擁有廣泛

See all articles