PHP中的ZVAL是什么?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)是專業(yè)的衡山網(wǎng)站建設(shè)公司,衡山接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行衡山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
ZVAL的基本結(jié)構(gòu)
Zval是PHP中最重要的數(shù)據(jù)結(jié)構(gòu)之一(另一個比較重要的數(shù)據(jù)結(jié)構(gòu)是hash table
),它包含了PHP中的變量值和類型的相關(guān)信息。
它是一個struct,基本結(jié)構(gòu)為:
struct _zval_struct { zvalue_value value; /* 存儲變量的值*/ zend_uint refcount__gc; /* 表示引用計數(shù) */ zend_uchar type; /* 變量具體的類型 */ zend_uchar is_ref__gc; /* 表示是否為引用 */ }; typedef struct _zval_struct zval;
其中:
1、zval_value value
變量的實際值,具體來說是一個zvalue_value
的聯(lián)合體(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
該值實際上是一個計數(shù)器,用來保存有多少變量(或者符號,symbols, 所有的符號都存在符號表(symble table)中, 不同的作用域使用不同的符號表,關(guān)于這一點,我們之后會論述)指向該zval。
在變量生成時,其refcount=1,典型的賦值操作如a=b會令zval的refcount加1,而unset操作會相應(yīng)的減1。在PHP5.3之前,使用引用計數(shù)的機制來實現(xiàn)GC,如果一個zval的 refcount較少到0,那么Zend引擎會認為沒有任何變量指向該zval,因此會釋放該zval所占的內(nèi)存空間。
但,事情有時并不會那么簡單。后面 我們會看到,單純的引用計數(shù)機制無法GC掉循環(huán)引用的zval,即使指向該zval的變量已經(jīng)被unset,從而導(dǎo)致了內(nèi)存泄露(Memory Leak)。
3、zend_uchar type
該字段用于表明變量的實際類型。在開始學(xué)習(xí)PHP的時候,我們已經(jīng)知道,PHP中的變量包括四種標量類(bool,int,float,string),兩種復(fù)合類型(array, object)和兩種特殊的類型(resource 和NULL)。
在zend內(nèi)部,這些類型對應(yīng)于下面的宏(代碼位置 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的共享、分離等。關(guān)于這點,我們之后會有論述。
正如名字所示,ref_count__gc
和is_ref__gc
是PHP的GC機制所需的很重要的兩個字段,這兩個字段的值,可以通過xdebug等調(diào)試工具查看。
關(guān)于PHP中的ZVAL是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
新聞名稱:PHP中的ZVAL是什么
網(wǎng)站網(wǎng)址:http://chinadenli.net/article40/jsihho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、用戶體驗、建站公司、網(wǎng)站維護、網(wǎng)站收錄、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)