Je veux utiliser une foreach
boucle avec une variable, mais cette variable peut être de nombreux types différents, NULL
par exemple.
Alors avant de le foreach
tester:
if(is_array($var)){
foreach($var as ...
Mais j'ai réalisé que cela peut aussi être une classe qui implémente l' Iterator
interface. Peut-être que je suis aveugle mais comment vérifier si la classe implémente l'interface? Y a-t-il quelque chose comme une is_a
fonction ou un inherits
opérateur? J'ai trouvé class_implements
, je peux l'utiliser, mais peut-être qu'il y a quelque chose de plus simple?
Et deuxièmement, plus important, je suppose que cette fonction existe, serait-il suffisant pour vérifier si la variable is_array
ou "implémente l' Iterator
interface" ou devrais-je tester quelque chose de plus?
Réponses:
Si vous utilisez à l'
foreach
intérieur d'une fonction et que vous attendez un tableau ou un objet Traversable , vous pouvez taper hint cette fonction avec:Si vous n'utilisez pas à l'
foreach
intérieur d'une fonction ou que vous attendez les deux, vous pouvez simplement utiliser cette construction pour vérifier si vous pouvez itérer sur la variable:la source
is_array
cher. Le coût de calcul semble augmenter avec la taille du tableau (ce qui n'a aucun sens car il s'agit simplement de vérifier s'il s'agit d'un tableau). Mais cela m'est arrivé de manière choquante dans une bibliothèque. Voir mon commentaire dans la question liée. Fonctionnera-t-ilinstanceof Traversable
avec des tableaux? Je n'ai pas eu la chance de tester ses performances.Traversable
so yes.$var = array(1,2,3);
les résultats sont:is_array($var) = true
et$var instanceof Traversable = false
.Iterator
et ne fonctionnent donc pas avecTraversable
.foreach
peut gérer des tableaux et des objets. Vous pouvez vérifier cela avec:Vous n'avez pas besoin de vérifier spécifiquement car
Traversable
d'autres l'ont laissé entendre dans leurs réponses, car tous les objets - comme tous les tableaux - sont traversables en PHP.Plus techniquement:
( source )
Simplement dit dans la programmation PHP courante, chaque fois qu'une variable est
et n'est pas
vous pouvez l'utiliser
foreach
.la source
Vous pouvez vérifier l'instance de
Traversable
avec une fonction simple. Cela fonctionnerait pour tout celaIterator
parce queIterator extends Traversable
la source
retourne
bool(false)
oubool(true)
la source
Les fonctions
Exemple
la source
Depuis PHP 7.1, il existe un pseudo-type
iterable
exactement dans ce but. L'indication de typeiterable
accepte n'importe quel tableau ainsi que toute implémentation de l'Traversable
interface. PHP 7.1 a également introduit la fonctionis_iterable()
. Pour les anciennes versions, consultez les autres réponses ici pour effectuer l'application de type équivalente sans les nouvelles fonctionnalités intégrées.Fair play: Comme l'a souligné BlackHole, cette question semble être un double des objets Iterable et des indices de type de tableau? et sa réponse va plus loin que la mienne.
la source