2013-01-05 69 views
2

我在PHP中使用數組和對象得到了一個奇怪的行爲,我不明白。也許你們可以幫助我。陣列副本中的PHP對象

創建陣列,將其複製到另一個陣列,第二陣列中改變一個值,並如預期的一切:現在

$array1['john']['name'] = 'foo'; 
$array2 = $array1; 
$array2['john']['name'] = 'bar'; 

echo $array1['john']['name']; // foo 
echo $array2['john']['name']; // bar 

,如果我是數組中做到這一點與物體,物體在複製數組擁有某種參考?

$array3['john']->name = 'foo'; 
$array4 = $array3; 
$array4['john']->name = 'bar'; 

echo $array3['john']->name; // bar 
echo $array4['john']->name; // bar 

我會期待與第一個例子中的行爲相同,我在php文檔中找不到任何關於此的內容。有人可以向我解釋或向我發送一個鏈接,告訴我這是記錄在哪裏?

謝謝!

+1

'當分配一個類的已經創建的實例到一個新的變量,新的變量將訪問相同的實例作爲已分配的對象。將實例傳遞給函數時,此行爲是相同的。可以通過克隆已經創建的對象的副本。 '(http://php.net/manual/en/language.oop5.basic.php) –

回答

4

默認情況下,對象通過引用傳遞。如果將某個標量值或數組賦值給其他變量,則會將其克隆。如果分配對象,則只複製引用,但對象不是。

在分配一個類的已經創建的實例爲新 變量,新的變量將訪問同一個實例爲被分配了對象 。將實例 傳遞給函數時,此行爲是相同的。可以通過 複製已經創建的對象的副本。

http://php.net/manual/en/language.oop5.basic.php

所以,你需要調用clone如果你想另一個對象。

$array4['john'] = clone $array3['john']; 
+0

好的,理解。有沒有辦法用一個語句克隆該數組中的所有對象? $ array4 = clone $ array3;不工作。 – MrAsk

+0

檢查array_map(http://php.net/manual/en/function.array-map.php)函數。 –

+0

您可以使用循環。 'foreach($ array1 as $ key => $ value)if(is_object($ value))$ array2 [$ key] = clone $ value;'。但是如果你需要這種行爲,我會建議使用數組而不是stdClass對象。 –

0

嘗試使用clone想你的目標工作。

有人爲此寫了一個函數,當對象在數組中時。

這裏link