Question

récentes mises à jour PHP, ils ont ajouté dans différentes interfaces pour permettre un objet à traiter comme un tableau, comme ArrayAccess, Iterator, dénombrable, etc.

Ma question est, serait-il alors logique que les éléments suivants devraient fonctionner:

function useArray(array $array)
{
    print_r($array);
}

useArray(new ArrayObj(array(1,2,3,4,5));

En ce moment, PHP renvoie une erreur de type laissant entendre, comme $array n'est pas techniquement un tableau. Cependant, il met en œuvre toutes les interfaces qui le rend essentiellement identique à un tableau.

echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2

Logiquement, l'objet doit pouvoir être utilisé partout un tableau peut être utilisé, car il met en œuvre la même interface comme un tableau.

Suis-je confus dans ma logique, ou est-il est logique que si un objet implémente la même interface comme un tableau, il devrait pouvoir être utilisé dans tous les lieux mêmes?

Était-ce utile?

La solution

  

Suis-je confus dans ma logique, ou est-elle   est logique que si un objet   met en œuvre la même interface comme   tableau, il devrait pouvoir être utilisé dans   tous les mêmes endroits?

Un array est un type de variable PHP spéciale - pas un objet - en tant que tel, il ne met pas en œuvre toutes les interfaces. ArrayObject est un objet à part entière qui implémente de nombreuses interfaces (Countable, ArrayAccess, etc.) et permet à un objet d'agir comme un tableau dans certains cas (comme dans une boucle foreach). Ainsi, alors qu'ils ne mettent pas en œuvre les mêmes interfaces qu'ils parfois ont le même comportement.

La solution idéale serait de PHP pour soutenir les signatures de fonctions multiples:

function useArray(array $array) { }
function useArray(ArrayObject $array) { }

Mais jusqu'à ce que nous que (si jamais nous que) vous suffit de vérifier les types de variables en dehors de la définition de la fonction:

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!');
 }
}

Ou essayer de faire des choses de type array avec l'argument $array et gérer des avertissements / erreurs useArray pourrait générer.

Autres conseils

Votre type hinting est sa indiquant « tableau » de type, mais votre passage dans un « ArrayObj »

function useArray(array $array)
...
useArray(new ArrayObj

Alors oui sa va se plaindre.

  

Suis-je confus dans ma logique, ou est-elle   est logique que si un objet   met en œuvre la même interface comme   tableau, il devrait pouvoir être utilisé dans   tous les mêmes endroits?

Si l'objet implémente la même interface que une autre classe, oui vous pouvez les utiliser de façon interchangeable, mais il reste valable pour le compilateur de se plaindre au sujet de votre type hinting, puisque ce ne est pas du même type.

Tout simplement parce que deux objets implémentent la même interface ne signifie pas qu'ils sont du même type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top