字符串处理是我们常用的操作,而 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 定义
立即学习“PHP免费学习笔记(深入)”;
<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教程有兴趣的朋友有所帮助。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号