Uzatılmış PHP DiziNesnesi Doğru Çalışmıyor

2 Cevap php

Ben SPL ArrayObject genişletmeye çalışıyorum ama biraz pürüz çıktı ettik. Modifiye edilmemiş bir ArrayObject kullanarak, bu kod çalışır:

$a = new ArrayObject();
$a[1][2] = 'abc';
print_r($a);

Bu çıktıyı veren:

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [1] => Array
                (
                    [2] => abc
                )

        )
)

Ben ArrayObject uzatmak ve offsetGet yöntemi aşırı Ancak eğer

class ExtendedArray extends ArrayObject {
    function offsetGet($i) {
        return parent::offsetGet($i);
    }
}

$a = new ExtendedArray();
$a[1][2] = 'abc';
print_r($a);

O zaman bu gibi başarısız olur:

ExtendedArray Object
(
    [storage:ArrayObject:private] => Array
        (
        )

)

Ne çok boyutlu diziler ile benim genişletilmiş sınıf çalışması yapmak sürer?

2 Cevap

Benim için, pasajı içerisinde 1. ziyade değil # 2, bozuldu. Sen var olmayan bir öğe erişiyor ve kodu # 2 bir beklediğiniz tam olarak ne verir: bir uyarı. 1. tür "eser" nedeni bir cilvesi, ya da php iki tuhaflıklar olduğunu. Tercüman uyarı tek kelime etmeden - null üzerinde [] = operatörünü uyguladığınızda Birincisi, bu boş "sihirli" bir diziye dönüştü olduğunu.

$a = null;
$a[1] = 'foo'; // "works"
print_r($a); 

İkincisi, bu (bilinçli veya bilinçsiz) null için geçerli değildir __ get veya offsetGet döndü.

class foo {
    function __get($s) { return null; }
}

$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);  

hata mesajı bu iyi bir şey, ne olursa olsun anlamına, "aşırı mülkiyet Dolaylı değişiklik" diyor, ve - eğer herhangi bir şekilde boş değerini değiştirmek için izin verilmez.