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

发表评论

相关推荐
朱丰华   |   7个月前   |   php

php判断是否被iframe

221    评论    点赞
朱丰华   |   1年前   |   php

php正则表达式定界符:异常Delimiter must not be alphanumeric or backslash

190    评论    点赞
朱丰华   |   1年前   |   请求 · 一个

ab测压命令,apache测压工具

172    评论    点赞
朱丰华   |   1年前   |   php · 缓存 · opcache

php 加速、提高并发opcache

198    评论    点赞
朱丰华   |   1年前   |   正则 · 表达

正则表达式,实现if...then...else

113    评论    点赞
朱丰华   |   1年前   |   变量 · mysql · sql · 用户

MySQL用户自定义变量

95    评论    点赞
朱丰华   |   1年前   |   sql · php

PHP如何使用PDO批量执行SQL?

115    评论    点赞
朱丰华   |   1年前   |   php · 字符 · 字符串

如何在 PHP 中将字符串的第一个字母转换为大写

150    评论    点赞
朱丰华   |   1年前   |   php · 字符 · 正则

php正则表达式原生字符

86    评论    点赞
朱丰华   |   1年前   |   字符 · php · 比较

PHP比较字符串大小相关函数

111    评论    点赞
朱丰华   |   1年前   |   php

windows下编写、编译php扩展

158    评论    点赞
朱丰华   |   1年前   |   linux · php

linux下编写、编译php扩展

150    评论    点赞
朱丰华   |   1年前   |   js · export · import

js es6 export,import,export default的用法和区别

125    评论    点赞
朱丰华   |   1年前   |   php · 混淆 · obfuscate · git

yakpro-po混淆php代码

106    评论    点赞
朱丰华   |   1年前   |   php

php扩展编译nts的方法

86    评论    点赞
朱丰华   |   1年前   |   javascript · js · obfuscator · 混淆

javascript-obfuscator混淆js文件

52    评论    点赞
朱丰华   |   1年前   |   html

html input datetime-local设置初始值

99    评论    点赞
朱丰华   |   1年前   |   linux · 变量 · 环境

linux查看环境变量、设置环境变量

94    评论    点赞
朱丰华   |   1年前   |   js · php · 字符 · 字符串

php json_encode对字符串转义用法

135    评论    点赞
朱丰华   |   1年前   |   php · 捕获

php Fatal error怎么捕获

127    评论    点赞
{{item.author_name}}   |   {{new Date(item.date*1000).log()}}   |   {{it}} ·

{{item.title}}

{{item.uv}}    评论    点赞