PHP ZVAL是PHP中最重要的資料結構之一,包含了PHP中的變數值和型別的相關資訊,它是struct結構,基本結構為【struct _zval_struct(zvalue_value value zend_uchar type)】。
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 ZVAL是什麼意思?的詳細內容,更多請關注TW511.COM其它相關文章!