php变量结构体union

PHP中,所有的变量都是用一个结构-zval来保存的,在Zend/zend.h中我们可以看到zval的定义

typedef struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
} zval;

其中zvalue_value是真正保存数据的关键部分,定义为一个联合体(union)

typedef union _zvalue_value {
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
} zvalue_value;

从这个结构里可以看出php中所有变量的痕迹:
IS_BOOL(boolen),是存储在lval里面,和整数存储是一样的。这里大家应该想到==和===对于false和0处理的不同之处了
IS_LONG(整型),存储在lval
IS_DOUBLE(浮点型),存储在dval
IS_STRING(字符串),存储在str
IS_ARRAY(数组),存储在*ht哈希table中
IS_OBJECT(对象),存储在zend_object_value
IS_NULL,NULL值在这个结构中不用存储,直接在zval结构中的type字段进行判断。

你可能感兴趣的:(数据结构与算法)