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?

War es hilfreich?

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.

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