$a = 1;$b = &$a; //傳址。註解掉此行回傳5,不註解時(PHP版本<7的)回傳6$c = ( $a) ( $a);echo $c;跟版本有關係嗎?還有就是結果是6啊,百思不得其解啊
认证高级PHP讲师
$b = &$a;
這個操作,可以認為,$a和$b都指向原本$a變量所在的那塊內存(為了方便後面解釋,稱為內存X),也就是說,後面任何對於$a或$b的操作,都是在直接對這塊記憶體裡的數值進行修改。
$a
$b
內存X
所以加上這一行之後的運作流程:
前面步驟省略,初始a為1
$c = (++$a) + (++$a)的兩次++$a都是在操作記憶體X,也就是把記憶體X裡的值自增了兩次,所以,在運算$c的值的時候,取的是這個記憶體裡數的值,也就是自增了兩次之後的記憶體X裡的值。所以,是3 + 3 = 6(運算$c時候,記憶體X裡存的值是3)。
$c = (++$a) + (++$a)
++$a
記憶體X
3 + 3 = 6
$c
如果不加引用,那麼對於$a的自增接操作直接修改內存X,而後通過運算符操作返回內存X的副本,這樣,兩次的++$a結果由於不是直接從記憶體X取得的,而是改變記憶體X值之後的副本,所以$c在運算的時候就是2 + 3 = 5。
內存X的副本
2 + 3 = 5
這個跟PHP的底層實現有關,說起來很長,推薦看一下github上同樣問題的解析一個PHP bug引發的探索:https://github.com/xurenlu/ph...
你輸出C,C跟你的B有什麼關係?
先說一下加上了引用賦值的操作
這個操作,可以認為,
$a
和$b
都指向原本$a
變量所在的那塊內存(為了方便後面解釋,稱為內存X
),也就是說,後面任何對於$a
或$b
的操作,都是在直接對這塊記憶體裡的數值進行修改。所以加上這一行之後的運作流程:
前面步驟省略,初始a為1
$c = (++$a) + (++$a)
的兩次++$a
都是在操作記憶體X
,也就是把記憶體X
裡的值自增了兩次,所以,在運算$c的值的時候,取的是這個記憶體裡數的值,也就是自增了兩次之後的記憶體X
裡的值。所以,是3 + 3 = 6
(運算$c
時候,記憶體X
裡存的值是3)。再說一下註解了引用之後的操作
如果不加引用,那麼對於
$a
的自增接操作直接修改內存X
,而後通過運算符操作返回內存X的副本
,這樣,兩次的++$a
結果由於不是直接從記憶體X
取得的,而是改變記憶體X
值之後的副本,所以$c
在運算的時候就是2 + 3 = 5
。這個跟PHP的底層實現有關,說起來很長,推薦看一下github上同樣問題的解析
一個PHP bug引發的探索:
https://github.com/xurenlu/ph...
你輸出C,C跟你的B有什麼關係?