Question

Essayez comme je pourrais, je ne peux pas obtenir ma tête autour de ce que la classe IteratorIterator fait en réalité. Je comprends que les classes peuvent mettre en œuvre Traversable de sorte que le moteur sait qu'il peut boucle en utilisant foreach et Je me rends compte que IteratorIterator est censé convertir tout ce qui est Praticable en itérateur, mais je ne peux pas pour la vie de me comprendre.

Prenons, par exemple, la classe PDOStatement ; Comment les méthodes standard iterator (suivant, clé, retour rapide, etc.) être mis en œuvre pour permettre l'itération sur une PDOStatement?

Désolé si ma question ne sait pas, je suis juste du mal à saisir la raison exacte de cette classe et la documentation à ce sujet est peu.

Merci,

Will

Mise à jour: En passant par les fichiers HPTP, j'ai trouvé un test qui utilise IteratorIterator:

<?php

$root = simplexml_load_string('<?xml version="1.0"?>
<root>
    <child>Hello</child>
    <child>World</child>
</root>
');

foreach (new IteratorIterator($root->child) as $child) {
    echo $child."\n";
}

?>

Le résultat attendu est:

Hello
World

Je ne suis pas vraiment comment la construction de IteratorIterator prend enfant $ root-> comme argument et comment il parvient à itérer sur les éléments enfants.

Était-ce utile?

La solution

Basé sur cette , je pense qu'il vous permet de itérer objets sur Iterated. C'est à dire. vous pouvez tirer d'autres objets dans votre objet maître et en utilisant IteratorIterator sur votre objet maître, itérer l'enfant des objets aussi bien.

MISE À JOUR: En fonction de votre mise à jour. Cela est logique pour moi, mais il n'y a qu'un seul objet racine, donc itérer ne s'applique pas vraiment dans cet exemple, mais vous pouvez s'il y avait plus des objets racine. En d'autres termes, je crois IteratorIterator est la même que celle ayant des boucles foreach imbriquées, sans avoir à connaître tous les éléments de chaque objet. En d'autres termes, un foreach imbriquée à l'aide d'objets orientés objet ... il y a une déclaration redondante. : -)

Autres conseils

Si vous navez pas trouvé encore, https: //www.phpro. org / tutoriels / introduction à SPL.html a quelques exemples qui pourraient vous aider.


IteratorIterator>

  • "Cette enveloppe itérateur permet conversion de tout ce qui est Praticable en itérateur. "

Traversable>

  • "Interface pour détecter si une classe est Praticable en utilisant foreach. "
  • «classes internes (intégré) qui mettre en œuvre cette interface peut être utilisée dans un foreach construire et ne pas besoin de mettre en œuvre IteratorAggregate ou Iterator. "
  • "Ceci est une interface interne du moteur qui ne peut être mis en œuvre en PHP scripts. Soit IteratorAggregate ou Iterator doit être utilisé à la place. "

Le site a quelques exemples de RecursiveIteratorIterator qui pourraient être à portée de main mais, si je l'obtiens droit , IteratorIterator est du point de vue de script assez inutile (lorsqu'il est utilisé pour foreach au moins).

Il crée Iterateable objets en objets implémentant l'interface Traversable, mais les classes internes implémentant l'interface Traversable sont foreachable de toute façon et les scripts ne peut pas mettre en œuvre Traversable ...

(Non mentionné dans la documentation, la SimpleXMLElement met en œuvre Traversable)

Je pensais par exemple # 2 est assez simple ...
il vous permet essentiellement de mettre en œuvre un comportement spécifique pour votre classe pour les suivant / précédent / courant / retour rapide / fonctions de tableau clé, attendu par l'analyseur php foreach.

pour mettre en œuvre votre question, on pourrait créer une classe Iterator avec un PDOStatement comme memeber, que par exemple utiliser la méthode suivante pour appeler la PDOStatement :: fetch pour retourner sa prochaine déclaration. le stockage il vous permettra de mettre en œuvre à la fois perivous et à jour. havn't utilisé cette classe trop, mais je parie que ce n'est pas difficile o mettre en œuvre un retour rapide et la clé. noter que ceci est à la volée, donc je peux me tromper sur les détails, mais je pense que le concept devrait être clair

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