Zval是PHP中最重要的資料結構之一,它包含了PHP中變數的值和型別相關資訊。
typedef struct _zval_struct zval;struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t var_flags; uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* literal cache slot */ 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 */ } u2;};
zval結構比較簡單, 由三個部分組成:
為了更直覺的看下zval的結構及核心字段的取值,我們上張圖。
對u1.v.type的說明:
zval的中zend_value定義如下:
typedef union _zend_value { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; 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;
#在一個zval中:
所以一個zval佔用16位元組。在對應php5中,一個zval的大小為48位元組,的確是巨大的提升。
可依zval.u1.v.type直接區分,無須zend_value參與
直接儲存在zend_value的lval或dval中。
使用zend_value對應的指針,指向其具體的結構。
例如字串型別的結構為
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
一個字符串變數記憶體組織如下圖所示, zval.value.str指向zend_string結構。
Zval是PHP中最重要的資料結構之一,它包含了PHP中變數的值和類型相關資訊。
推薦學習:《PHP7教學》
以上是一文帶你分析php7的zval的詳細內容。更多資訊請關注PHP中文網其他相關文章!