Zval是PHP中最重要的資料結構之一,它包含了PHP中變數的值和型別相關資訊。
1. zval
1.1 zval的結構(zend_types.h)
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,通常用在函數類型上。例如聲明一個函數或方法。
1.2 zend_value
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;
1.3 zval記憶體佔用
#在一個zval中:
- zend_value為union,只佔8位元組。剛好可以存放一個zend_long或是一個double,又或者一個指標。
- u1為4位元組,儲存一個v或type_info
- u2為4位元組
所以一個zval佔用16位元組。在對應php5中,一個zval的大小為48位元組,的確是巨大的提升。
2. 變數儲存
2.1 true, false, null
可依zval.u1.v.type直接區分,無須zend_value參與
2.2 long,double
直接儲存在zend_value的lval或dval中。
2.3 其它型別(string,array,object,resource等)
使用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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具