天天看点

php内核-数据类型结构体&联合体zval

结构体&联合体

php内核-数据类型结构体&联合体zval

结构体内每一个变量都独占一块内存,并保持内存对齐

php内核-数据类型结构体&联合体zval

联合体内所有变量公用同一块内存,占用内存大小为联合体中占用内存最大的变量的内存大小

zval

zval定义

每个变量的结构定义

struct _zval_struct {
    zend_value        value;            /* value 变量值*/
    union {
        struct {
            ZEND_ENDIAN_LOHI_3(
                zend_uchar    type,         /* active type 变量类型 */
                zend_uchar    type_flags,   /* 类型掩码,各类型会有几个不同的属性值,用于内存管理*/
                union {
                    uint16_t  call_info;    /* call info for EX(This) */
                    uint16_t  extra;        /* not further specified */
                } u)
        } v;
        uint32_t type_info;
    } u1;
    union {
        uint32_t     next;                 /* hash collision chain */
        uint32_t     cache_slot;           /* cache slot (for RECV_INIT) */
        uint32_t     opline_num;           /* opline number (for FAST_CALL) */
        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 */
        uint32_t     access_flags;         /* class constant access flags */
        uint32_t     property_guard;       /* single property guard */
        uint32_t     constant_flags;       /* constant flags */
        uint32_t     extra;                /* not further specified */
    } u2;
};
           
  1. zend_value表示变量的值
  2. u1表示变量的类型
  3. u2用于辅助功能

zend_value定义

typedef union _zend_value {
    zend_long         lval;             /* 整型 */
    double            dval;             /* 浮点型 */
    zend_refcounted  *counted;          /* 获取不同类型结构的gc头部 */
    zend_string      *str;              /* 字符型 */
    zend_array       *arr;              /* array数组 */
    zend_object      *obj;              /* object对象 */
    zend_resource    *res;              /* resource类型 */
    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;
           

1. 整型

在一个x86_64的机器中,整型的定义

typedef int64_t zend_long;

如果是32位的机器中,整型的定义

typedef int32_t zend_long;

2. 浮点型

从定义可以看出,就是double类型

3. 字符串-string

字符串的基本定义为:

struct _zend_string {
    zend_refcounted_h gc;               /* 用于gc */
    zend_ulong        h;                /* hash value */
    size_t            len;              /* 字符串长度 */
    char              val[1];           /* 字符串的实际内容,默认数组为1 */
};
           

4. 数组-array

数组的基本定义

struct _zend_array {
    zend_refcounted_h gc;
    union {
        struct {
            ZEND_ENDIAN_LOHI_4(
                zend_uchar    flags,
                zend_uchar    _unused,
                zend_uchar    nIteratorsCount,
                zend_uchar    _unused2)
        } v;
        uint32_t flags;
    } u;
    uint32_t          nTableMask;
    Bucket           *arData;              /* 数组中实际存储的数据节点 */
    uint32_t          nNumUsed;            /* 数组中使用的个数 */
    uint32_t          nNumOfElements;      /* 数组中元素个数 */
    uint32_t          nTableSize;          /* 数组大小 */
    uint32_t          nInternalPointer;
    zend_long         nNextFreeElement;
    dtor_func_t       pDestructor;
};
           

Bucket结构,数组中的每个元素的实际存储结构

typedef struct _Bucket {
    zval              val;
    zend_ulong        h;                /* hash value (or numeric index)   */
    zend_string      *key;              /* string key or NULL for numerics */
} Bucket;
           

变量数据类型的表示(u1.v.type)

#define IS_UNDEF                    0
#define IS_NULL                     1
#define IS_FALSE                    2
#define IS_TRUE                     3
#define IS_LONG                     4
#define IS_DOUBLE                   5
#define IS_STRING                   6
#define IS_ARRAY                    7
#define IS_OBJECT                   8
#define IS_RESOURCE                 9
#define IS_REFERENCE                10