天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

深入解析PHP的引用計(jì)數(shù)機(jī)制

php的變量聲明并賦值后,變量名存在符號(hào)表中,而值和類信息存在zval中,zval中包含四個(gè)變量,is_ref,refcount,value,type,zval源碼如下
復(fù)制代碼 代碼如下:
struct _zval_struct { 
    /* Variable information */ 
    zvalue_value value;     /* value */ 
    zend_uint refcount__gc; 
    zend_uchar type;    /* active type */ 
    zend_uchar is_ref__gc; 
};

refcount表示value地址與其相同的zval共有多少個(gè),refcount=0時(shí),zval被銷毀
is_ref表示一個(gè)zval是否被引用,有“0”和“1”兩種狀態(tài)

此處分析一下什么時(shí)候zval會(huì)被復(fù)制或者開(kāi)辟新的內(nèi)存空間呢
1.當(dāng)is_ref=0,且refcount>1時(shí),如果改變某個(gè)指向該zval的變量的值,會(huì)生成新zval,原zval的refcount--,例如:$a=1;$b=$a;$b=2;,zval將被復(fù)制,也就是說(shuō)原先ab指向同一個(gè)zval,后來(lái)b會(huì)使用新開(kāi)辟的zval

2.當(dāng)is_ref=0,且refcount>1時(shí),如果將zval賦值給某個(gè)引用變量,那么用來(lái)賦值和變量和被賦值的變量會(huì)使用同一個(gè)原zval,而其他指向原zval的變量將會(huì)指向一個(gè)新復(fù)制的zval,且refcount會(huì)被重新計(jì)算,例如:$a=1;$b=$a;$c=$a;$d=&$a;,此時(shí)ad使用原zval,bc使用新復(fù)制出來(lái)的zval

3.當(dāng)is_ref=1,且refcount>1時(shí),如果將zval復(fù)制給某個(gè)非引用變量,該非引用變量會(huì)使用一個(gè)新復(fù)制的zval,元zval的refcount不變,例如:$a=1;$b=&$a;$c=$a,那么ab使用原zval,而c使用新復(fù)制的zval
type表示該zval的值類型,宏定義如下
復(fù)制代碼 代碼如下:
#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

value表示該zval的值,他也是個(gè)共同體,代碼如下
復(fù)制代碼 代碼如下:
typedef union _zvalue_value { 
    long lval;                  /* long value */ 
    double dval;                /* double value */ 
    struct { 
        char *val; 
        int len; 
    } str; 
    HashTable *ht;              /* hash table value */ 
    zend_object_value obj; 
} zvalue_value;

現(xiàn)在你知道php是如何類型變換的了,因?yàn)樗闹荡娴钠鋵?shí)是個(gè)可以代表任何類型的結(jié)構(gòu)體,而具體的取值則根據(jù)type來(lái)決定是用共同體里的哪個(gè)變量來(lái)存值的

見(jiàn)下面的例子1
復(fù)制代碼 代碼如下:
.-----------
$a = 1;
$b = $a;
$c = $a;
.-----------
$d = &$a;
.-----------
$a = 2;
.-----------
$b = null;

查看refcount,is_ref,zval的變化
執(zhí)行完第一部分后來(lái)看看輸出
1-----------------------------
a:(refcount=3, is_ref=0),int 1
b:(refcount=3, is_ref=0),int 1
c:(refcount=3, is_ref=0),int 1
可以看出來(lái)a,b,c使用同一個(gè)zval
再看執(zhí)行完第二部分的
2----------------------------
a:(refcount=2, is_ref=1),int 1
b:(refcount=2, is_ref=0),int 1
c:(refcount=2, is_ref=0),int 1
d:(refcount=2, is_ref=1),int 1
注意此時(shí)a,d在一起了,他們使用同一個(gè)zval,而bc使用一個(gè)新生成的zval,同時(shí)重新計(jì)算兩個(gè)zval的refcount和is_ref
3----------------------------
a:(refcount=2, is_ref=1),int 2
b:(refcount=2, is_ref=0),int 1
c:(refcount=2, is_ref=0),int 1
d:(refcount=2, is_ref=1),int 2
可以知道ad這兩個(gè)is_ref=1的好基友的值是同時(shí)改變的
4----------------------------
a:(refcount=2, is_ref=1),int 2
b:(refcount=1, is_ref=0),null
c:(refcount=1, is_ref=0),int 1
d:(refcount=2, is_ref=1),int 2
bc由于他們的zval的is_ref=0,所以他們不是好基友,他們的值不會(huì)同時(shí)改變,于是bc的zval再次分裂,b = null c = 1

php技術(shù)深入解析PHP的引用計(jì)數(shù)機(jī)制,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 美女扒开屁股让男人桶 | 嗯啊快拔出来我是你老师视频 | 97色伦图区97色伦综合图区 | 久久伊人网站 | 久久久久久久久久久福利观看 | 色狠狠xx | 内射无码AV-区二区在线观看 | 日本中文字幕巨大的乳专区 | 中文字幕完整高清版 | 亚洲国产AV一区二区三区四区 | 亚洲激情网站 | 啊灬啊别停灬用力啊在线观看视频 | 精品国产成人AV在线看 | 葵司中文第一次大战黑人 | 成人国内精品久久久久影院 | 亚洲欧美成人 | 成人欧美尽粗二区三区AV | 无码内射成人免费喷射 | 肉动漫无修在线播放 | 哺乳期妇女挤奶水36d | 欧美亚洲精品一区二三区8V | 亚洲spank男男实践网站 | 97成人精品视频在线播放 | 亚洲国产精品一区二区第一页 | 拔萝卜在线高清观看视频 | 日日AV夜夜添久久奶无码 | 野花社区视频WWW高清 | 97SE亚洲国产综合在线 | 在线天天看片免费视频观看 | 婷婷开心激情综合五月天 | 富婆大保健嗷嗷叫普通话对白 | 天堂so导航 | 国产精品 中文字幕 亚洲 欧美 | YELLOW日本动漫高清免费 | 1区2区3区4区产品不卡码网站 | 国产精品日本欧美一区二区 | 日韩a在线看免费观看视频 日韩a视频在线观看 | 精品免费久久久久久成人影院 | 日本人xxxⅹ18hd19hd | ABO成结顶腔锁住 | 全免费午夜一级毛片 |