Herhangi bir nedenle PHP referans dizi yineleme değil mi?

3 Cevap php
$arr = array(array(array()));
foreach($arr as $subarr)
{
 $subarr[] = 1;
}
var_dump($arr);

Çıktı:

array(1) {
  [0]=>
  array(1) {
    [0]=>
    array(0) {
    }
  }
}

Ama nesne için, bu referans bulunuyor:

class testclass {
}

$arr = array(new testclass());
foreach($arr as $subarr)
{
 $subarr->new = 1;
}
var_dump($arr);

Çıktı:

array(1) {
  [0]=>
  object(testclass)#1 (1) {
    ["new"]=>
    int(1)
  }
}

Neden tedavi dan array farklı object?

3 Cevap

PHP referans olarak tüm nesneleri geçer. (PHP5?)

PHP değerine göre tüm diziler geçer.

Başlangıçta PHP değeri hem nesneleri ve diziler geçti, ancak oluşturulan nesnelerin sayısını azaltmak amacıyla, otomatik referans geçmek için nesneleri geçmek.

Orada PHP referans diziler geçmez neden mantıklı bir sebep değil gerçekten, ama bu dil çalıştığını ne olduğunu. Eğer gerekiyorsa bu değer ile diziler üzerinde yineleme mümkündür ancak referans ile açıkça bir değer beyan etmek zorunda:

foreach ( $myArray as &$val ){
    $val = 1; //updates the element in $myArray
}

Thanks to Yacoby, örneğin.

Diziler temel veri yapısı bir tür çünkü nesneleri daha karmaşık veri yapıları ise açıkçası ben, değer geçirilecek diziler tercih. Mevcut sistem, en azından benim için, mantıklı.

Neden dizi ve nesne aynı muamele olurdu?

PHP sadece referans nesneleri geçer (->), ve değerine göre tüm diziler geçer.

Tüm nesneler, değere göre iletilmiş ise, komut böylece daha fazla bellek kullanarak, aynı sınıfın birçok kopyalarını yapmak istiyorum.

Foreach kopyalar iterated dizi o bu şekilde kullanmak daha kolaydır foreach içinde iken, ve orijinal diziyi değiştirmek sağlar çünkü. Bu böyle olmaz, ilk örnek havaya uçurmak olacaktır. Bir foreach içindeki dizi kopyalama PHP tutmak için hiçbir yolu yoktur. Pass-madde-by-başvuru sözdizimi kullanarak bile foreach($foo as &$bar), hala dizi, yerine gerçek değerleri başvurular içeren birinin bir kopyası üzerinde çalışacağız.

Çoğu nesne yönelimli geliştiriciler her zaman referans olarak kabul edilecek nesneleri, diğer taraftan, bekleniyor. Bu PHP 5 vaka oldu ve nesneleri içeren bir dizi kopyaladığınız zaman, aslında nesnelere başvurular kopyalayın.; Eğer dizinin bir kopyası üzerinde çalışıyoruz olsa bile, bu yüzden aynı nesneler üzerinde çalışıyoruz.

Eğer bir nesneyi kopyalamak isterseniz, clone operatörünü kullanın. Bildiğim kadarıyla, bazı nesneleri her zaman değer geçirilecek olması için hiçbir yolu yoktur.

$foo = new Foo;
$bar = clone $foo;