Erweiterte PHP Arrayobject funktioniert nicht richtig
-
23-09-2019 - |
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?
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