天天看點

認識Zval

什麼是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來解讀.

文獻

  1. 這一篇文章詳細講述Zval的内容,包括發展史和存在的問題

    https://www.laruence.com/2018/04/08/3170.html

  2. 官網計數器的詳解

    https://www.php.net/manual/zh/features.gc.refcounting-basics.php