php扩展zend_string类型与char类型转换
zend
php
字符串
_string
编程技术
发布日期
2023-06-04
更新日期
2023-06-04
阅读次数 97
文章字数 1.1k
每次 PHP 需要使用字符串时,都会使用 zend_string
结构。该结构仅仅是 C 语言的 char *
字符串类型的简单精简包装。
它添加了内存管理的功能,所以同一字符串可以在多个地方共享,而无需重复。另外,一些字符串是 “内部的”,即 “持久的” 分配,并通过内存管理特殊管理,以便它们不会在多个请求中被销毁。之后,那些从 Zend 内存管理获得永久分配。
zend_string操作需要的头文件。 Zend/zend_string.h
从char *变成 zend_string *例子,使用zend_string_init,最后的0或1表示是否永久分配,一般是0
zend_string *str;
str = zend_string_init("foo", strlen("foo"), 0);
有时我们需要反向操作,把zend_string变成char,用到的是ZSTR_VAL,或长度,或释放字符串
zend_string *str;
str = zend_string_init("foo", strlen("foo"), 0);
php_printf("This is my string: %s
", ZSTR_VAL(str));
php_printf("It is %zd char long
", ZSTR_LEN(str));
zend_string_release(str);
如果忘记释放字符串,则很可能造成内存泄漏。
因为字符串是引用类型数字,可以复制一个引用变量
/* 创建变量bar2,共享变量bar的值。
另外递增"bar"字符串的引用计数到2 */
bar2 = zend_string_copy(bar);
如果要强制复制,则使用dup
/* 在内存中复制"bar"字符串,创建变量 baz,
使 baz 单独拥有新创建的"bar"字符串 */
baz = zend_string_dup(bar, 0);
另外字符串是根据hash识别的
如果你需要访问哈希值,可使用 ZSTR_H()。但创建 zend_string 时,不会自动计算其哈希值。而当将该字符串与 HashTable API 一起使用时,它将为你完成。如果你强制立即计算哈希值,可使用 ZSTR_HASH() 或 zend_string_hash_val()。当哈希值被计算出来,它会被保存起来并且不再被计算。无论如何,你必须使用 zend_string_forget_hash_val() 重新计算 —— 因为你改变了字符串的值:
zend_string_hash_val(str);
php_printf("The string hash is %lu
", ZSTR_H(str));
/* 更改第二个"bar"字符串的最后一个字符,
变为"baz" */
ZSTR_VAL(baz)[ZSTR_LEN(baz) - 1] = 'z';
/* 当字符串改变时,忘记旧哈希值(如果已计算),
因此其哈希值必须更改并重新计数 */
zend_string_forget_hash_val(baz);
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-422.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。
zend
php
字符串
_string
发表评论
相关推荐