什麼是Zval
Zval是PHP中變量的結構體
結構體
{key,value,ref_count,is_ref,type}
翻譯後的結構體:{鍵,值(使用的是聯合結構體),使用計數器,引用計數器,類型}
有哪些類型
IS_NULL, IS_LONG, IS_STRING, IS_ARRAY, IS_OBJECT
引用計數器
每當我們建立一個變量的時候,作業系統都會開辟一份空間通過結構體将變量存儲起來。那麼相同的鍵值進行建立那麼會使系統顯得笨重起來(意味着每次操作都要開辟空間生成變量),那麼這時候引入了引用計數器。引入計數器主要是對同一個記憶體資料進行統一管理。
心得:
上面隻是簡單的寫到ZVAL結構體的解釋,主要的是想要引入垃圾回收機制和對hashtable的探究。
附上結構體PHP5
struct _zval_struct {
union {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
zend_ast *ast;
} value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
};
根據type字段的值不同, 我們就要用不同的方式解讀value的值, 這個value是個聯合體, 比如對于type是IS_STRING, 那麼我們應該用value.str來解讀zval.value字段, 而如果type是IS_LONG, 那麼我們就要用value.lval來解讀.
文獻
-
這一篇文章詳細講述Zval的内容,包括發展史和存在的問題
https://www.laruence.com/2018/04/08/3170.html
-
官網計數器的詳解
https://www.php.net/manual/zh/features.gc.refcounting-basics.php