首頁  >  文章  >  後端開發  >  關於PHP變數分離及引用的問題

關於PHP變數分離及引用的問題

WBOY
WBOY原創
2016-10-22 00:14:161018瀏覽

今天看鳥哥關於PHP變數分開、引用的文章,有一個問題沒有弄清楚,先把部分截圖貼出來:

關於PHP變數分離及引用的問題

如果按照上面的說法,那我把程式碼稍作修改如下:

<code><?php
   $var = "laruence";
   $var_dup = &$var;
   $var_ref = &$var;
   $var_ref = "OK";
?>
</code>

那麼

程式碼的第二行:
$var_dup 和 $var 指向相同的zval, refcount為2.

當執行第三行的時候:
PHP發現要操作的zval的refcount大於1,則,PHP會執行Separation, 將$var_dup分離出去,並將$var和$var_ref做change on write關聯。也就是,refcount=2, is_ref=1;

在進行到第四行的時候:
由於$var和$var_ref指向的zval的is_ref=1;所以不會分離,使得$var_ref和$var的值都為"OK".

以我的理解,程式的最後,由於$var_dup在執行第三行的時候就已經分離出去了,所以它的值應該保持"laruence"不變,但是,我運行程式的時候發現,它也變成了"OK",這讓我很是費解,希望知道答案的大神幫幫我。不知道是我理解錯了還是另有隱情,謝謝!

另外附上兩個小栗子供大神參考:

<code><?php
   $var = "laruence";
   $var_ref = "OK";
   $var_dup = &$var;
   $var = &$var_ref;


   echo $var;        //OK
   echo $var_dup;    //laruence
   echo $var_ref;    //OK      
?>
</code>
<code><?php
   $var = "laruence";
   $var_ref = "OK";
   $var_dup = &$var;
   $var_ref = &$var;


   echo $var;        //laruence
   echo $var_dup;    //laruence
   echo $var_ref;    //laruence      
?>
</code>

回覆內容:

今天看鳥哥關於PHP變數分開、引用的文章,有一個問題沒有弄清楚,先把部分截圖貼出來:

關於PHP變數分離及引用的問題

如果按照上面的說法,那我把程式碼稍作修改如下:

<code><?php
   $var = "laruence";
   $var_dup = &$var;
   $var_ref = &$var;
   $var_ref = "OK";
?>
</code>

那麼

程式碼的第二行:
$var_dup 和 $var 指向相同的zval, refcount為2.

當執行第三行的時候:
PHP發現要操作的zval的refcount大於1,則,PHP會執行Separation, 將$var_dup分離出去,並將$var和$var_ref做change on write關聯。也就是,refcount=2, is_ref=1;

在進行到第四行的時候:
由於$var和$var_ref指向的zval的is_ref=1;所以不會分離,使得$var_ref和$var的值都為"OK".

以我的理解,程式的最後,由於$var_dup在執行第三行的時候就已經分離出去了,所以它的值應該保持"laruence"不變,但是,我運行程式的時候發現,它也變成了"OK",這讓我很是費解,希望知道答案的大神幫幫我。不知道是我理解錯了還是另有隱情,謝謝!

另外附上兩個小栗子供大神參考:

<code><?php
   $var = "laruence";
   $var_ref = "OK";
   $var_dup = &$var;
   $var = &$var_ref;


   echo $var;        //OK
   echo $var_dup;    //laruence
   echo $var_ref;    //OK      
?>
</code>
<code><?php
   $var = "laruence";
   $var_ref = "OK";
   $var_dup = &$var;
   $var_ref = &$var;


   echo $var;        //laruence
   echo $var_dup;    //laruence
   echo $var_ref;    //laruence      
?>
</code>

Copy On Write! ! ! ! ! ! ! ! ! ! ! !
寫時複製! ! ! ! ! ! ! ! ! ! ! !

你程式碼的第三行有寫入操作嗎?沒有幹嘛需要執行分離! ?
第三行的操作是把refcount增加為3。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn