真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP中的ZVAL是什么

PHP中的ZVAL是什么?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)是專業(yè)的衡山網(wǎng)站建設(shè)公司,衡山接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行衡山網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

ZVAL的基本結(jié)構(gòu)

Zval是PHP中最重要的數(shù)據(jù)結(jié)構(gòu)之一(另一個(gè)比較重要的數(shù)據(jù)結(jié)構(gòu)是hash table),它包含了PHP中的變量值和類型的相關(guān)信息。

它是一個(gè)struct,基本結(jié)構(gòu)為:

struct _zval_struct {
    zvalue_value value;     /* 存儲(chǔ)變量的值*/
    zend_uint refcount__gc;  /* 表示引用計(jì)數(shù) */
    zend_uchar type;          /* 變量具體的類型 */
    zend_uchar is_ref__gc;    /* 表示是否為引用 */
};
typedef struct _zval_struct zval;

其中:

1、zval_value value

變量的實(shí)際值,具體來說是一個(gè)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í)際上是一個(gè)計(jì)數(shù)器,用來保存有多少變量(或者符號(hào),symbols, 所有的符號(hào)都存在符號(hào)表(symble table)中, 不同的作用域使用不同的符號(hào)表,關(guān)于這一點(diǎn),我們之后會(huì)論述)指向該zval。

在變量生成時(shí),其refcount=1,典型的賦值操作如a=b會(huì)令zval的refcount加1,而unset操作會(huì)相應(yīng)的減1。在PHP5.3之前,使用引用計(jì)數(shù)的機(jī)制來實(shí)現(xiàn)GC,如果一個(gè)zval的 refcount較少到0,那么Zend引擎會(huì)認(rèn)為沒有任何變量指向該zval,因此會(huì)釋放該zval所占的內(nèi)存空間。

但,事情有時(shí)并不會(huì)那么簡(jiǎn)單。后面 我們會(huì)看到,單純的引用計(jì)數(shù)機(jī)制無法GC掉循環(huán)引用的zval,即使指向該zval的變量已經(jīng)被unset,從而導(dǎo)致了內(nèi)存泄露(Memory Leak)。

3、zend_uchar type

該字段用于表明變量的實(shí)際類型。在開始學(xué)習(xí)PHP的時(shí)候,我們已經(jīng)知道,PHP中的變量包括四種標(biāo)量類(bool,int,float,string),兩種復(fù)合類型(array, object)和兩種特殊的類型(resource 和NULL)。

在zend內(nèi)部,這些類型對(duì)應(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

這個(gè)字段用于標(biāo)記變量是否是引用變量。對(duì)于普通的變量,該值為0,而對(duì)于引用型的變量,該值為1。這個(gè)變量會(huì)影響zval的共享、分離等。關(guān)于這點(diǎn),我們之后會(huì)有論述。

正如名字所示,ref_count__gcis_ref__gc是PHP的GC機(jī)制所需的很重要的兩個(gè)字段,這兩個(gè)字段的值,可以通過xdebug等調(diào)試工具查看。

關(guān)于PHP中的ZVAL是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


本文名稱:PHP中的ZVAL是什么
本文地址:http://weahome.cn/article/jsihho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部