一文带你分析php7的zval
Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。
1. zval
1.1 zval的结构(zend_types.h)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
zval结构比较简单, 由三个部分组成:
- zend_value:保存具体变量类型的值或指针
- u1的核心作用是区分类型
- u2为辅助值
为了更直观的看下zval的结构及核心字段的取值,我们上张图。
对u1.v.type的说明:
- IS_UNDEF:标记未定义,表示数据可以被覆盖或者删除。比如在对数组元素进行unset操作时,PHP 7并不会直接将数据从分配给HashTable的内存中删掉,而是先将该元素所在的Bucket的位置标记为IS_UNDEF,当HashTable中IS_UNDEF元素个数到达一定阈值时,进行rehash操作时再将IS_UNDEF标记的元素覆盖或删除。
- IS_TRUE和IS_FALSE:这里将IS_BOOL优化成两个,直接将布尔类型的标记记录在type中。
- IS_REFERENCE:是新增的类型,PHP7中使用不同的处理方式来处理“&”
- IS_INDIRECT:同样也是新增的类型,由于PHP 7中HashTable的设计跟PHP5中有很大的不同,所以在解决全局符号表访问CV变量表的问题上,引入了IS_INDRECT类型。
- IS_PTR:该类型被定义为指针类型,用来解析value.ptr,通常用在函数类型上。比如声明一个函数或者方法。
1.2 zend_value
zval的中zend_value定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1.3 zval内存占用
在一个zval中:
- zend_value为union,只占8字节。刚好可以存放一个zend_long或是一个double,又或者一个指针。
- u1为4字节,存储一个v或type_info
- u2为4字节
所以一个zval占用16字节。相应php5中,一个zval的大小为48字节,的确是巨大的提升。
2. 变量存储
2.1 true, false, null
可根据zval.u1.v.type直接区分,无需zend_value参与
2.2 long,double
直接存储在zend_value的lval或dval中。
2.3 其它类型(string,array,object,resource等)
使用zend_value对应的指针,指向其具体的结构。
比如字串类型的结构为
1 2 3 4 5 6 |
|
一个字串变量内存组织如下图所示, zval.value.str指向zend_string结构。
Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。
推荐学习:《PHP7教程》
以上是一文带你分析php7的zval的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)