Heim  >  Artikel  >  Backend-Entwicklung  >  php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL

php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL

WBOY
WBOYOriginal
2016-08-08 09:22:361695Durchsuche

字符串处理是我们常用的操作,而 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教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn