Frage

Ich versuche, die SPL Arrayobject zu verlängern, aber ich habe ein wenig Haken schlagen. Unter Verwendung eines unmodifizierten Arrayobject, dieser Code funktioniert:

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

Nachgeben dieser Ausgabe:

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

        )
)

Allerdings, wenn ich verlängere Arrayobject und überlastete die offsetGet Methode

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

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

es scheitert dann wie folgt aus:

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

)

Was bedeutet es, bis meine erweiterten Klasse Arbeit mit mehrdimensionalen Arrays machen?

War es hilfreich?

Lösung

Für mich ist das Snippet # 1 ist eher gebrochen, nicht die # 2. Sie Zugriff auf ein Element, das nicht existiert hat, und der Code # 2 gibt Ihnen genau das, was man erwarten würde: eine Warnung aus. Der Grund, warum # 1 irgendwie „Werke“ ist eine Marotte oder zwei Macken von PHP. Erstens, wenn Sie [] = Operator auf null gelten, ist dies null „magisch“ in ein Array gedreht - ohne einziges Wort der Warnung von Dolmetschern.

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

Zweitens ist diese (absichtlich oder nicht) gilt nicht für NULL-Werte aus __get oder offsetGet zurückgegeben.

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

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

Die Fehlermeldung lautet „Indirekte Änderung von überladener Eigenschaft“, und, was immer das bedeutet, es ist eine gute Sache -. Sie den Nullwert in irgendeiner Weise nicht erlaubt zu ändern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top