PHP ZVAL是PHP中最首要的数据构造之一,蕴含了PHP中的变量值以及类型的相干信息,它是struct构造,根本构造为【struct _zval_struct(zvalue_value value zend_uchar type)】。
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;
此中:
一、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;
二、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)。
三、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
四、is_ref__gc
这个字段用于标志变量能否是援用变量。关于一般的变量,该值为0,而关于援用型的变量,该值为1。这个变量会影响zval的同享、别离等。对于这点,咱们之后会有阐述。
正如名字所示,ref_count__gc
以及is_ref__gc
是PHP的GC机制所需的很首要的两个字段,这两个字段的值,能够经过xdebug等调试对象查看。
相干学习保举:PHP编程从入门到通晓
以上就是PHP ZVAL是甚么意义?的具体内容,更多请存眷资源魔其它相干文章!
标签: php php教程 zval php故障解决 php使用问题
抱歉,评论功能暂时关闭!