解释
这里基于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 <stdio.h>#include<string.h> int main(){char hello[] = "hs"; printf("%s \n", hello); return 0;}
C措辞的字符串没有存储长度,它因此null为终止符的,也便是碰着'\0'字符就认为是结束了。
我们比拟下,C与PHP中获取字符串长度的差异。
#include <stdio.h>#include<string.h> 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./hellowordhello长度 1hello1长度 2
PHP
echo strlen("h\0s");echo PHP_EOL;echo strlen("hs");echo PHP_EOL;
php hello.php32
可以看到zend_string的len是很便捷的、很安全的。
总结
php通过zend_string存储字符串,个中len存放字符串长度,val存放值。