PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

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

原创
2016-08-08 09:22:36 1393浏览

字符串处理是我们常用的操作,而 zend 封装了很多关于字符串操作相关的宏,先看下 ZVAL_STRING 和 ZVAL_STRINGL

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

 #define ZVAL_STRINGL(z, s, l, duplicate) do {   \constchar *__s=(s); int __l=l;         \
         zval *__z = (z);                        \
         Z_STRLEN_P(__z) = __l;                  \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(char*)__s);\
         Z_TYPE_P(__z) = IS_STRING;              \
     } while (0)

因为 php 内部很多字符串操作(例如 substr)最后都是给予这样的宏来操作的,所以在这里了解这两个宏非常重要。

ZVAL_STRINGL 在处理的时候,因为给了 length 参数,所以不需要在使用 strlen 来求字符串的长度了, 性能上有所提升。

前面在常用的 zend api 里面应该说过了,关于 estrndup 也都是封装了一层的,在 php 扩展开发的时候,尽量使用系统封装的函数,这样可以优化内存,降低内存泄漏等风险,有几个 e* 开发的函数,可以看之前的相关文章。

estrndup 定义

#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)

_estrndup 定义

 ZEND_API char *_estrndup(constchar *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
     char *p;
 #ifdef ZEND_SIGNALS
     TSRMLS_FETCH();
 #endif     HANDLE_BLOCK_INTERRUPTIONS();

     p = (char *) _emalloc(length+1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
     if (UNEXPECTED(p == NULL)) {
         HANDLE_UNBLOCK_INTERRUPTIONS();
         return p;
     }
     memcpy(p, s, length);
     p[length] = 0;
     HANDLE_UNBLOCK_INTERRUPTIONS();
     return p;
 }

可以自行搜索关于 _emalloc 等相关函数定义。

以上就介绍了php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。