您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)php7中zval的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Zval是PHP中最重要的數(shù)據(jù)結(jié)構(gòu)之一,它包含了PHP中變量的值和類型相關(guān)信息。
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結(jié)構(gòu)比較簡單, 由三個部分組成:
zend_value:保存具體變量類型的值或指針
u1的核心作用是區(qū)分類型
u2為輔助值
為了更直觀的看下zval的結(jié)構(gòu)及核心字段的取值,我們上張圖。
對u1.v.type的說明:
IS_UNDEF:標記未定義,表示數(shù)據(jù)可以被覆蓋或者刪除。比如在對數(shù)組元素進行unset操作時,PHP 7并不會直接將數(shù)據(jù)從分配給HashTable的內(nèi)存中刪掉,而是先將該元素所在的Bucket的位置標記為IS_UNDEF,當HashTable中IS_UNDEF元素個數(shù)到達一定閾值時,進行rehash操作時再將IS_UNDEF標記的元素覆蓋或刪除。
IS_TRUE和IS_FALSE:這里將IS_BOOL優(yōu)化成兩個,直接將布爾類型的標記記錄在type中。
IS_REFERENCE:是新增的類型,PHP7中使用不同的處理方式來處理“&”
IS_INDIRECT:同樣也是新增的類型,由于PHP 7中HashTable的設(shè)計跟PHP5中有很大的不同,所以在解決全局符號表訪問CV變量表的問題上,引入了IS_INDRECT類型。
IS_PTR:該類型被定義為指針類型,用來解析value.ptr,通常用在函數(shù)類型上。比如聲明一個函數(shù)或者方法。
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字節(jié)。剛好可以存放一個zend_long或是一個double,又或者一個指針。
u1為4字節(jié),存儲一個v或type_info
u2為4字節(jié)
所以一個zval占用16字節(jié)。相應(yīng)php5中,一個zval的大小為48字節(jié),的確是巨大的提升。
可根據(jù)zval.u1.v.type直接區(qū)分,無需zend_value參與
直接存儲在zend_value的lval或dval中。
使用zend_value對應(yīng)的指針,指向其具體的結(jié)構(gòu)。
比如字串類型的結(jié)構(gòu)為
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
一個字串變量內(nèi)存組織如下圖所示, zval.value.str指向zend_string結(jié)構(gòu)。
感謝各位的閱讀!關(guān)于“php7中zval的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。