聲明:我一直無法找到明確的參考,所以我主要是在這裏推斷。
常規引用通過符號表工作。當創建一個變量和一個值,都被存儲在本地符號表如下所示:
$foo = "bar";
+--------+-------+
| symbol | value |
+--------+-------+
| $foo | "bar" |
+--------+-------+
當創建參考,這只是增加了一個符號爲相同的值表:
$bar =& $foo;
+------------+-------+
| symbol | value |
+------------+-------+
| $foo, $bar | "bar" |
+------------+-------+
數組鍵是存儲方式不同,但:
$var[0] = 'a';
+--------+-----------------+
| symbol | value |
+--------+-----------------+
| $var | array(0 => 'a') |
+--------+-----------------+
有符號表的$var
項,但數組中的值是不單獨中引用符號表。我推斷創建對值'a'
(存儲在$var[0]
)的參考時,必須發生的是,該值'a'
從陣列分離$var
和$var[0]
本身變得到'a'
被存儲的新位置的引用:
$foo =& $var[0];
+--------+------------------+
| symbol | value |
+--------+------------------+
| $var | array(0 => %REF) |
| $foo | %REF |
| %REF | 'a' |
+--------+------------------+
我猜符號表的內部實現不允許創建對數組鍵的直接引用,因此這是創建對數組元素的引用的唯一方法。
所以複製$var
到$tmp
時,參考被複制與它:
$tmp = $var;
+--------+------------------+
| symbol | value |
+--------+------------------+
| $var | array(0 => %REF) |
| $foo | %REF |
| %REF | 'a' |
| $tmp | array(0 => %REF) |
+--------+------------------+
然後,改變值$var[0]
是指當,它改變的%REF
值,這既$tmp
和$var
參考。
正如我所說,這可能是也可能不是對內部發生的事情的準確解釋,但它說明了原則。
請注意,各種「傳遞*」術語僅適用於函數參數。這裏沒有變數,只有賦值。 – outis 2012-02-24 06:12:03