PHP ZVAL是什么意思?-PHP问题

资源魔 37 0

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使用问题

抱歉,评论功能暂时关闭!