首頁  >  文章  >  後端開發  >  PHP ZVAL是什麼意思?

PHP ZVAL是什麼意思?

coldplay.xixi
coldplay.xixi原創
2020-07-02 09:38:264450瀏覽

PHP ZVAL是PHP中最重要的資料結構之一,包含了PHP中的變數值和類型的相關信息,它是struct結構,基本結構為【struct _zval_struct(zvalue_value value zend_uchar type)】 。

PHP ZVAL是什麼意思?

PHP ZVAL的意思是:

ZVAL的基本結構

Zval是PHP中最重要的資料結構之一(另一個比較重要的資料結構是hash table),它包含了PHP中的變數值和類型的相關資訊。

它是一個struct,基本結構為:

struct _zval_struct {
    zvalue_value value;     /* 存储变量的值*/
    zend_uint refcount__gc;  /* 表示引用计数 */
    zend_uchar type;          /* 变量具体的类型 */
    zend_uchar is_ref__gc;    /* 表示是否为引用 */
};
typedef struct _zval_struct zval;

其中:

1、zval_value value

變數的實際值,具體來說是一個

zvalue_value

的聯合體(union):

typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {                    /* string */
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value,used for array */
    zend_object_value obj;      /* object */
} zvalue_value;

 

#2、 zend_uint refcount__gc  

 

該值實際上是計數器,用來保存有多少變數(或符號,symbols, 所有的符號都存在符號表(symble table)中, 不同的作用域使用不同的符號表,關於這一點,我們之後會論述)指向該zval。

在變數產生時,其refcount=1,典型的賦值運算如a=b會令zval的refcount加1,而unset操作會對應的減1。在PHP5.3之前,使用引用計數的機制來實作GC,如果一個zval的 refcount較少到0,那麼Zend引擎會認為沒有任何變數指向該zval,因此會釋放該zval所佔的記憶體空間。

但,事情有時並不會那麼簡單。後面 我們會看到,單純的引用計數機制無法GC掉循環引用的zval,即使指向該zval的變數已經被unset,從而導致了記憶體洩漏(Memory Leak)。

 

3、zend_uchar type

 

此欄位用於顯示變數的實際類型。在開始學習PHP的時候,我們已經知道,PHP中的變數包括四種標量類別(bool,int,float,string),兩種複合類型(array, object)和兩種特殊的類型(resource 和NULL) 。

在zend內部,這些類型對應到下面的巨集(程式碼位置phpsrc/Zend/zend.h):

#define IS_NULL     0
#define IS_LONG     1
#define IS_DOUBLE   2
#define IS_BOOL     3
#define IS_ARRAY    4
#define IS_OBJECT   5
#define IS_STRING   6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY   9
#define IS_CALLABLE 10

 

#4、

is_ref__gc

 ######這個欄位用來標記變數是否為引用變數。對於普通的變量,該值為0,而對於引用型的變量,該值為1。這個變數會影響zval的共享、分離等。關於這點,我們之後會有論述。 ######正如名字所示,###ref_count__gc###和###is_ref__gc###是PHP的GC機制所需的很重要的兩個字段,這兩個字段的值,可以通過xdebug等調試工具查看。 ###### #########相關學習推薦:###PHP程式設計從入門到精通#########

以上是PHP ZVAL是什麼意思?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn