Frage
In den letzten Updates zu PHP, fügten sie in verschiedenen Schnittstellen ein Objekt zu ermöglichen, als ein Array behandelt werden, wie Arrayaccess, Iterator, Buchhaltungs-, usw.
Meine Frage ist, wäre es dann sinnvoll, dass die folgenden funktionieren sollte:
function useArray(array $array)
{
print_r($array);
}
useArray(new ArrayObj(array(1,2,3,4,5));
Ab jetzt, wirft PHP einen Typ-Hinting Fehler, als $array
technisch nicht ein Array ist. Es kann jedoch implementiert alle Schnittstellen, die es im Grunde identisch mit einem Array macht.
echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2
Logisch, sollte das Objekt der Lage sein, überall ein Array verwendet werden, kann verwendet werden, da sie die gleiche Schnittstelle wie ein Array implementiert.
Bin ich in meiner Logik verwirrte, oder nicht macht es Sinn, dass, wenn ein Objekt die gleiche Schnittstelle wie ein Array implementiert, sollte es in der Lage sein, in all den gleichen Orten verwendet werden?
Lösung
Bin ich in meiner Logik verwirrt, oder tut es wenn ein Objekt macht Sinn, dass implementiert die gleiche Schnittstelle wie eine Array, sollte es in der Lage sein, verwendet wird in alle die gleichen Orte?
Ein array
ist ein spezieller PHP-Variable Typ - nicht ein Objekt - als solche keine Schnittstellen nicht implementiert. ArrayObject
ist ein vollwertiger Objekt, die zahlreichen Schnittstellen (Countable
, ArrayAccess
, etc.) implementiert und ermöglicht, ein Objekt wie ein Array in bestimmten Fällen zu wirken (wie in einer foreach Schleife). So, während sie nicht implementieren die gleichen Schnittstellen sie manchmal verhalten gleich.
Die ideale Lösung wäre für PHP mehrere Funktionssignaturen zu unterstützen:
function useArray(array $array) { }
function useArray(ArrayObject $array) { }
Aber bis wir bekommen, dass (wenn wir das jemals bekommen) Sie werden nur Variablen-Typen außerhalb der Funktionsdefinition überprüfen müssen:
function useArray($array) {
if (is_array($array) || $array instanceof ArrayObject) {
// Do some stuff
} else {
throw new Exception('I require an array or an array-like structure!');
}
}
Oder versuchen array
-Typ Material mit dem $array
Argument zu tun und behandeln alle Warnungen / Fehler, die useArray
erzeugen könnten.
Andere Tipps
Ihre Type Hinting ist unter Angabe seiner vom Typ "Array", aber Ihre Weitergabe in einer "ArrayObj"
function useArray(array $array)
...
useArray(new ArrayObj
Also ja sein Gehen zu beschweren.
Bin ich in meiner Logik verwirrt, oder tut es wenn ein Objekt macht Sinn, dass implementiert die gleiche Schnittstelle wie eine Array, sollte es in der Lage sein, verwendet wird in alle die gleichen Orte?
Wenn das Objekt die gleiche Schnittstelle wie eine andere Klasse implementiert, ja man kann sie austauschbar verwenden, aber es immer noch gültig für den Compiler über Ihre Type Hinting zu beschweren, da es nicht von der gleichen Art.
Nur weil zwei Objekte die gleiche Schnittstelle implementieren bedeutet nicht, dass sie vom gleichen Typ sind.