Bu foreach bellekteki değerleri kopyalamak mı?

2 Cevap

Örnek:

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

Foreach $ değerine referans $ tuşunun arkasındaki değerini atar, ya $ değer dizide saklanan ne bir kopyası olacak? Ve evet eğer, nasıl ben sadece bir referans alabilir? Dizi değerleri böylece onları kopyalayarak veri oldukça büyük miktarlarda saklamak gerçekten iyi değil.

2 Cevap

Denemek ve tercüman burada hikayenin ahlaki ikinci tahmin yok. $value aslında bir kopya ama verimli bir kopyasıdır. PHP (non-nesneler için) pass-by-value kullanır ama aynı zamanda kopya-on-write kullanır. Eğer yazarsanız Bu demektir ki:

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

Sadece niyet beyan: Eğer dizi değerlerini kullanmak istiyorum. Bundan sonra PHP sıralayabilirsiniz dışarı edelim. Eğer dizisini değiştirmek niyetinde ise temelde yalnızca bu gibi döngüde başvuruları kullanabilirsiniz. Aksi takdirde kodu okur başkasına yanlış bir mesaj yolluyorlar.

Bölüm 1 Copy-on-Write in the PHP Language size hiç hakkında bilmek istediğiniz her şeyi söylemelidir PHP copy-on-write.

$value bir kopya olacak, ama (ben burada yanlış varsa birisi beni düzeltin lütfen), PHP aslında geçmek-by-value türü şeyler hakkında çok akıllı. Eğer değişkeni değiştirirseniz aslında bir pass-by-başvuru yapmak ve sadece kopyalar. Örneğin:

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);

Eğer orijinal diziyi değiştirmek istiyorsanız yılında foreach, bunu yapabilirsiniz:

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

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

Sadece $value okuma ve yazmadan değilseniz, o zaman bir sorun olmamalı.