今天看鳥哥關於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變數分開、引用的文章,有一個問題沒有弄清楚,先把部分截圖貼出來:
如果按照上面的說法,那我把程式碼稍作修改如下:
<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。