脚本宝典收集整理的这篇文章主要介绍了一文带你分析php7的zval,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。
typedef struct _zval_struct zval;struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t VAR_flags; uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* lITeral cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ } u2;};
zval结构比较简单, 由三个部分组成:
为了更直观的看下zval的结构及核心字段的取值,我们上张图。
对u1.v.type的说明:
zval的中zend_value定义如下:
typedef union _zend_value { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zend_ast_ref *ast; zval *zv; void *ptr; zend_class_entry *ce; zend_function *func; struct { uint32_t w1; uint32_t w2; } ww; } zend_value;
在一个zval中:
所以一个zval占用16字节。相应php5中,一个zval的大小为48字节,的确是巨大的提升。
可根据zval.u1.v.type直接区分,无需zend_value参与
直接存储在zend_value的lval或dval中。
使用zend_value对应的指针,指向其具体的结构。
比如字串类型的结构为
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
一个字串变量内存组织如下图所示, zval.value.str指向zend_string结构。
Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。
推荐学习:《PHP7教程》
以上就是一文带你分析php7的zval的详细内容,更多请关注脚本宝典其它相关文章!
以上是脚本宝典为你收集整理的一文带你分析php7的zval全部内容,希望文章能够帮你解决一文带你分析php7的zval所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。