2012-02-24 56 views
6

當我運行代碼吹塑:爲什麼在數組元素更改時,由值賦給數組元素的變量(在先前的通過引用分配之後)發生更改?

$var[0] = 'a'; 
$tmp = $var; 
$var[0] = 'b'; 
var_dump($tmp); 

輸出爲:

array(1) { [0]=> string(1) "a" } 

當我添加一行如下:

$var[0] = 'a'; 
$foo = & $var[0]; # added line 
$tmp = $var; 
$var[0] = 'b'; 
var_dump($tmp); 

輸出變爲:

array(1) { [0]=> &string(1) "b" } 

如果我通過引用數組的元素$var[0]分配變量$foo,那麼變量$tmp按值賦予數組$var應該如此變化?爲什麼會發生?

+0

請注意,各種「傳遞*」術語僅適用於函數參數。這裏沒有變數,只有賦值。 – outis 2012-02-24 06:12:03

回答

3

聲明:我一直無法找到明確的參考,所以我主要是在這裏推斷。

常規引用通過符號表工作。當創建一個變量和一個值,都被存儲在本地符號表如下所示:

$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參考。

正如我所說,這可能是也可能不是對內部發生的事情的準確解釋,但它說明了原則。

相關問題