PHP中的ZVAL是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
ZVAL的基本结构
Zval是PHP中最重要的数据结构之一(另一个比较重要的数据结构是hash table
),它包含了PHP中的变量值和类型的相关信息。
它是一个struct,基本结构为:
struct _zval_struct { zvalue_value value; /* 存储变量的值*/ zend_uint refcount__gc; /* 表示引用计数 */ zend_uchar type; /* 变量具体的类型 */ zend_uchar is_ref__gc; /* 表示是否为引用 */ }; typedef struct _zval_struct zval;
其中:
1、zval_value value
变量的实际值,具体来说是一个zvalue_value
的联合体(union):
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { /* string */ char *val; int len; } str; HashTable *ht; /* hash table value,used for array */ zend_object_value obj; /* object */ } zvalue_value;
2、zend_uint refcount__gc
该值实际上是一个计数器,用来保存有多少变量(或者符号,symbols, 所有的符号都存在符号表(symble table)中, 不同的作用域使用不同的符号表,关于这一点,我们之后会论述)指向该zval。
在变量生成时,其refcount=1,典型的赋值操作如a=b会令zval的refcount加1,而unset操作会相应的减1。在PHP5.3之前,使用引用计数的机制来实现GC,如果一个zval的 refcount较少到0,那么Zend引擎会认为没有任何变量指向该zval,因此会释放该zval所占的内存空间。
但,事情有时并不会那么简单。后面 我们会看到,单纯的引用计数机制无法GC掉循环引用的zval,即使指向该zval的变量已经被unset,从而导致了内存泄露(Memory Leak)。
3、zend_uchar type
该字段用于表明变量的实际类型。在开始学习PHP的时候,我们已经知道,PHP中的变量包括四种标量类(bool,int,float,string),两种复合类型(array, object)和两种特殊的类型(resource 和NULL)。
在zend内部,这些类型对应于下面的宏(代码位置 phpsrc/Zend/zend.h
):
#define IS_NULL 0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9 #define IS_CALLABLE 10
4、is_ref__gc
这个字段用于标记变量是否是引用变量。对于普通的变量,该值为0,而对于引用型的变量,该值为1。这个变量会影响zval的共享、分离等。关于这点,我们之后会有论述。
正如名字所示,ref_count__gc
和is_ref__gc
是PHP的GC机制所需的很重要的两个字段,这两个字段的值,可以通过xdebug等调试工具查看。
关于PHP中的ZVAL是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。