欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2013年06月14日 15:25:37   投稿:jingxian  
本篇文章是對PHP中的引用計數(shù)機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

PHP的變量聲明并賦值后,變量名存在符號表中,而值和類信息存在zval中,zval中包含四個變量,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共有多少個,refcount=0時,zval被銷毀
is_ref表示一個zval是否被引用,有“0”和“1”兩種狀態(tài)

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

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

3.當(dāng)is_ref=1,且refcount>1時,如果將zval復(fù)制給某個非引用變量,該非引用變量會使用一個新復(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的值,他也是個共同體,代碼如下
復(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是如何類型變換的了,因為他的值存的其實(shí)是個可以代表任何類型的結(jié)構(gòu)體,而具體的取值則根據(jù)type來決定是用共同體里的哪個變量來存值的
 
見下面的例子1
復(fù)制代碼 代碼如下:

.-----------
$a = 1;
$b = $a;
$c = $a;
.-----------
$d = &$a;
.-----------
$a = 2;
.-----------
$b = null;

查看refcount,is_ref,zval的變化
執(zhí)行完第一部分后來看看輸出
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
可以看出來a,b,c使用同一個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
注意此時a,d在一起了,他們使用同一個zval,而bc使用一個新生成的zval,同時重新計算兩個zval的refcount和is_ref

相關(guān)文章

  • 手把手教你使用DedeCms V3的在線采集圖文教程

    手把手教你使用DedeCms V3的在線采集圖文教程

    手把手教你使用DedeCms V3的在線采集圖文教程...
    2007-04-04
  • PHP中的閉包function()?use()?{}使用場景和技巧

    PHP中的閉包function()?use()?{}使用場景和技巧

    由于存在函數(shù)內(nèi)部不能訪問全局作用的,所以就需要一種可以引入上一級作用域的語法結(jié)構(gòu),可以通過use使用函數(shù)聲明時所在作用域的變量的值。php的閉包可能不常用,但是在某些場合之下還是可以考慮用php的閉包來實(shí)現(xiàn)某些功能的。
    2022-12-12
  • PHP 7.1中利用OpenSSL代替Mcrypt加解密的方法詳解

    PHP 7.1中利用OpenSSL代替Mcrypt加解密的方法詳解

    最近在開發(fā)微信公眾號功能的時候發(fā)現(xiàn)在PHP 7.1中Mcrypt已經(jīng)被棄用了,無奈只能找對應(yīng)的解決方法來替代,所以這篇文章主要給大家介紹了關(guān)于在PHP 7.1中利用OpenSSL代替Mcrypt加解密的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • PHP怎么實(shí)現(xiàn)網(wǎng)站保存快捷方式方便用戶隨時瀏覽

    PHP怎么實(shí)現(xiàn)網(wǎng)站保存快捷方式方便用戶隨時瀏覽

    網(wǎng)站保存快捷方式以后在瀏覽起來就比較方便了,實(shí)現(xiàn)的方法有很多,下面為大家詳細(xì)介紹下使用PHP實(shí)現(xiàn)網(wǎng)站快捷方式的保存,有此需求的朋友可以參考下,希望對大家有所幫助
    2013-08-08
  • PHP中Socket連接及讀寫數(shù)據(jù)超時問題分析

    PHP中Socket連接及讀寫數(shù)據(jù)超時問題分析

    這篇文章主要介紹了PHP中Socket連接及讀寫數(shù)據(jù)超時問題,分析了Socket連接的相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下
    2016-07-07
  • php比較兩個字符串長度的方法

    php比較兩個字符串長度的方法

    這篇文章主要介紹了php比較兩個字符串長度的方法,涉及php中strlen與abs函數(shù)計算字符串與數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • php 歸并排序 數(shù)組交集

    php 歸并排序 數(shù)組交集

    2個已經(jīng)排序好的數(shù)組交集,學(xué)習(xí)php的朋友可以參考下。
    2011-05-05
  • PHP中SimpleXML函數(shù)用法分析

    PHP中SimpleXML函數(shù)用法分析

    這篇文章主要介紹了PHP中SimpleXML函數(shù)用法,以實(shí)例形式詳細(xì)分析了采用SimpleXML函數(shù)操作XML文件的技巧,并附帶說明了相關(guān)的SimpleXML函數(shù),需要的朋友可以參考下
    2014-11-11
  • php實(shí)現(xiàn)jQuery擴(kuò)展函數(shù)

    php實(shí)現(xiàn)jQuery擴(kuò)展函數(shù)

    今天在運(yùn)行書上的jQuery代碼時,不知道是書上弄錯了,還是我的jQuery版本的問題,例子上面有一個jQuery函數(shù)不存在。
    2009-10-10
  • php中namespace use用法實(shí)例分析

    php中namespace use用法實(shí)例分析

    這篇文章主要介紹了php中namespace use用法,結(jié)合實(shí)例形式分析了PHP中命名空間的定義與使用技巧,需要的朋友可以參考下
    2016-01-01

最新評論