您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關php7中zval的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
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結構比較簡單, 由三個部分組成:
zend_value:保存具體變量類型的值或指針
u1的核心作用是區分類型
u2為輔助值
為了更直觀的看下zval的結構及核心字段的取值,我們上張圖。
對u1.v.type的說明:
IS_UNDEF:標記未定義,表示數據可以被覆蓋或者刪除。比如在對數組元素進行unset操作時,PHP 7并不會直接將數據從分配給HashTable的內存中刪掉,而是先將該元素所在的Bucket的位置標記為IS_UNDEF,當HashTable中IS_UNDEF元素個數到達一定閾值時,進行rehash操作時再將IS_UNDEF標記的元素覆蓋或刪除。
IS_TRUE和IS_FALSE:這里將IS_BOOL優化成兩個,直接將布爾類型的標記記錄在type中。
IS_REFERENCE:是新增的類型,PHP7中使用不同的處理方式來處理“&”
IS_INDIRECT:同樣也是新增的類型,由于PHP 7中HashTable的設計跟PHP5中有很大的不同,所以在解決全局符號表訪問CV變量表的問題上,引入了IS_INDRECT類型。
IS_PTR:該類型被定義為指針類型,用來解析value.ptr,通常用在函數類型上。比如聲明一個函數或者方法。
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中:
zend_value為union,只占8字節。剛好可以存放一個zend_long或是一個double,又或者一個指針。
u1為4字節,存儲一個v或type_info
u2為4字節
所以一個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結構。
感謝各位的閱讀!關于“php7中zval的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。