说明
这里基于php7.2.5进行测试,php7之后内部结构变化应该不是太大,但与php5.X有差别。
代码
基于上一篇我们说的 我们这次说一下字符串及实现
$a = "hello";
我们说zend_value.str结构用来存储字符串,具体到内部的结构就是zend_string
struct _zend_string {
zend_refcounted_h gc; /*引用计数 用于垃圾回收*/
zend_ulong h; /* hash value */
size_t len; /* 字符串长度 */
char val[1]; /* 值 hello */
};
这里我们只关注len与val。len用来存储字符串长度,val用来存储值, val是char类型的数组,char是字符类型,长度是1个字节,存储单个字符。
这里len的好处我们可以直接获取字符串的长度,如strlen($a) , 我们后面再说这个函数。
字符串在 C语言 中并不是内置类型,他其实是字符数组。C语言中声明字符串
# include
#include
int main()
{
char hello[] = "hs";
printf("%s \n", hello);
return 0;
}
C语言的字符串没有存储长度,它是以null为终止符的,也就是遇到’\0’字符就认为是结束了。
我们对比下,C与PHP中获取字符串长度的区别。
#include
#include
int main()
{
char hello[] = "h\0s";
char hello1[] = "hs";
int len,len1;
len = strlen(hello);
printf("hello长度 %d \n", len); // 1 因为遇到\0就终止了
len1 = strlen(hello1);
printf("hello1长度 %d \n", len1); //2
return 0;
}
gcc helloword.c -o helloword
./helloword
hello长度 1
hello1长度 2
PHP
echo strlen("h\0s");
echo PHP_EOL;
echo strlen("hs");
echo PHP_EOL;
php hello.php
3
2
可以看到zend_string的len是很便捷的、很安全的。
总结
php通过zend_string存储字符串,其中len存放字符串长度,val存放值。
海报
0 条评论
118
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~