前言
在讲zend_string之前,需要先了解下zval,如果还不了解zval是什么,可以先去我的这篇文章看下
https://blog.csdn.net/onlymayao/article/details/104783731
zend_string是什么
php的string类型对应的就是zend_string
zend_string结构体
struct _zend_string {
zend_refcounted_h gc;
zend_ulong h; /* hash value */
size_t len;
char val[1];
};
zend_string结构体参数解析
gc:指的是垃圾回收,*关键点是refcount引用计数,相信大家都听说过,结构体如下
typedef struct _zend_refcounted_h {
uint32_t refcount; /* reference counter 32-bit */
union {
uint32_t type_info;
} u;
} zend_refcounted_h;
h:指的是字符串对应的hash值,后边会用在数组里面
len:长度
val:字符串内容
php string 是否是二进制安全的
是,因为len表示长度val表示字符串,可以根据len去取val,即时中间有\0,也一样可以把整个字符串取出来。
写时复制
对于整型和其他简单的类型,因为是zval,16个字节可以表示,所以直接复制了,对于string
$a = 'abc';
$b = $a;
此时的 a 和 a和 a和b都是一个zval,它们的str指向的是同一个zend_string,这样我的内容只有一份,节约了空间,用gc中refcount标记,此时,refcount变成了2,表示被2个引用,当我们修改b的时候,a还是指向zval,指向zend_string,b开始复制一份在上面进行修改。