2010-01-05 49 views
1

例子:這個foreach會複製內存中的值嗎?

foreach ($veryFatArray as $key => $value) { 

將在foreach引用賦值背後的關鍵$價值爲$值,或將$值是一個什麼樣的存儲陣列中的副本?如果是的話,我怎樣才能得到一個參考?數組值存儲大量的數據,因此複製它們並不是很好。

回答

6

不要嘗試和猜測解釋者是這裏故事的寓意。 $value實際上是副本,但是是高效的副本。 PHP使用按值傳遞(對於非對象),但也使用了寫時複製。這意味着如果你寫:

foreach ($bigitems as $bigitem) { 
    echo $bigitem; // uses original 
    $bigitem = 'foo'; // item copied and assigned 'foo' 
    echo $bigitem; // uses copy 
} 

只是聲明你的意圖:你想使用數組值。讓PHP在那之後把它整理出來。基本上只使用循環中的引用,如果你打算更改數組。否則,您會將錯誤的消息發送給讀取您的代碼的其他人。

Copy-on-Write in the PHP Language的第1部分應該告訴你關於PHP copy-on-write的所有想知道的事情。

4

$value將是一個副本,但(如果我在這裏錯了,請別人糾正我),PHP實際上是非常聰明的傳遞值類型的東西。它實際上會做一個通過引用傳遞,如果你修改這個變量,它只會複製。例如:

function foo ($bar) { 
    echo $bar['x']; 
    // internally, $bar is a reference to $baz. (virtually) no extra memory used 
    $bar['y'] = 'Y'; 
    // only now has the array been copied in memory 
} 

$baz = array('x' => '1', 'y' => '2'); 
foo($baz); 

在你foreach,如果要修改原來的數組,你可以這樣做:

// PHP 4 
foreach (array_keys($veryFatArray) as $key) { 
    $value =& $veryFatArray[$key]; 
    // ... 
} 

// PHP 5 
foreach ($veryFatArray as $key => &$value) { } 

如果你只從$value讀,不寫它,那麼它應該不成問題。