PHP SPL: Hat seine Schnittstellen die Arrays decken alle Array-Eigenschaften?
Frage
Wäre es möglich, eine Klasse zu schreiben, die praktisch nicht von einer tatsächlichen PHP-Array ist durch alle notwendigen SPL-Schnittstellen implementieren? Sind sie etwas vermissen, die kritisch sein würde?
Ich möchte eine erweiterte Array-Objekt bauen, aber ich möchte sicherstellen, dass ich würde eine bestehende App nicht brechen, die Arrays überall verwendet, wenn ich sie mit einem benutzerdefinierten Array-Klasse ersetzt.
Lösung
Die einzigen Probleme, die ich denken kann, sind die gettype () und die is_array () Funktionen. Überprüfen Sie den Code für
gettype($FakeArray) == 'array'
is_array($FakeArray)
Denn obwohl Sie das Objekt wie ein Array verwendet werden können, wird es noch als Objekt identifiziert werden.
Andere Tipps
Zusätzlich zu den oben genannten Punkten, würden Sie nicht in der Lage sein, die User-Space-Array-Typ Hinweise arbeiten mit Instanzen Ihrer Klasse. Zum Beispiel:
<?php
function f(array $a) { /*...*/ }
$ao = new ArrayObject();
f($ao); //error
?>
Ausgabe:
Catchable fatal error: Argument 1 passed to f() must be an array, object given
Weitere Unterschiede sind die ‚+‘ Operator für Arrays (Verschmelzung) und das Scheitern der gesamten array_*
Funktionen, einschließlich der häufig verwendeten array_merge
und array_shift
.