2009-09-02 10 views
5

Spróbuj, jak mogę, nie mogę zrozumieć, co faktycznie robi klasa IteratorIterator. Rozumiem, że klasy mogą implementować Traversable, więc silnik wie, że może zapętlić się za pomocą foreach i Zdaję sobie sprawę, że IteratorIterator ma przekształcić wszystko, co jest Traversalable w Iterator, ale nie mogę do końca zrozumieć, w jaki sposób.Jak działa klasa IteratorIterator PHP?

Weźmy na przykład klasę PDOStatement; w jaki sposób zaimplementowane zostaną standardowe metody Iteratora (next, key, rewind, itp.), aby umożliwić iterację po PDOStatement?

Przepraszam, jeśli moje pytanie jest niejasne, po prostu staram się zrozumieć dokładny powód tej klasy, a dokumentacja na niej jest niewielka.

Dzięki,

Will

Aktualizacja: Przechodzi plików PHPT, znalazłem jeden test, który wykorzystuje 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"; 
} 

?> 

Oczekiwany wynik jest:

Hello 
World 

Tak naprawdę nie śledzę, jak konstrukcja IteratorIterator przyjmuje $ root-> child as argument i sposób, w jaki udaje mu się powtórzyć elementy potomne.

+0

Znalazłem odpowiedź [tutaj] (http://blog.ircmaxell.com/2011/10/iteratoriterator-php-inconsistencies.html). Ale wydaje mi się, że IteratorIterator ma teraz niewielkie znaczenie, prawda? – akond

Odpowiedz

1

Na podstawie this, myślę, że pozwala to na iterację nad iterowanymi obiektami. To znaczy. możesz ciągnąć inne obiekty w obiekcie głównym i używać IteratorIterator na obiekcie głównym, iterować również obiekty podrzędne.

AKTUALIZACJA: Na podstawie dokonanej aktualizacji. Ma to dla mnie sens, chociaż istnieje tylko jeden obiekt główny, więc iterowanie go nie ma zastosowania w tym przykładzie, ale można by było, gdyby było więcej obiektów root. Innymi słowy, uważam, że IteratorIterator jest tym samym, co zagnieżdżanie pętli foreach, bez konieczności poznawania wszystkich elementów każdego obiektu. Innymi słowy, zagnieżdżony foreach używa obiektów zorientowanych obiektowo ... istnieje nadmiarowa instrukcja. :-)

0

myślałem Przykład # 2 here jest dość proste ...
to w zasadzie pozwala realizować specyficzne zachowanie dla swojej klasy do następnego/poprzedniego/do tyłu/do kluczowych funkcji/bieżących tablicy, oczekiwanych przez parser php foreach .

Jeśli więc zaimplementujesz twoje pytanie, utworzysz klasę Iterator z PDOStatement jako mememerem, niż na przykład użyj następnej metody wywołania PDOStatement :: fetch, aby zwrócić następną instrukcję. przechowywanie go pozwoli ci zaimplementować zarówno peryferyjny, jak i bieżący. havn't używał tej klasy za dużo, ale założę się, że nie jest tak trudno o zaimplementować przewijanie i klucz. Zauważ, że to jest w locie, więc może być źle na szczegółach, ale myślę, że koncepcja powinna być jasna

+0

Nie jestem pewien, czy podążam. Przykład, z którym łączyłeś się, mówi o standardowym iteratorze, a nie o klasie IteratorIterator (http://us2.php.net/manual/en/class.iteratoriterator.php). Czy mógłbyś wyjaśnić? – WilliamMartin

2

Jeśli jeszcze go nie znalazłeś, https://www.phpro.org/tutorials/Introduction-to-SPL.html ma kilka przykładów, które mogą ci pomóc.


IteratorIterator>

  • „To iterator wrapper umożliwia konwersję niczego, co jest przesuwny do iterator .„

przesuwny>

  • «Interfejs do wykrycia, jeśli klasa jest przesuwny używając foreach».
  • ” wewnętrzne (wbudowane) klasy, które implementować ten interfejs może być stosowane w Konstrukcja foreach i nie wymaga implementacji IteratorAggregate lub Iterator. "
  • " To jest wewnętrzny interfejs silnika który c nie należy implementować skryptów PHP . Albo IteratorAggregate lub Iterator należy stosować zamiast „.

Strona zawiera kilka przykładów RecursiveIteratorIterator, które mogą być przydatne, ale jeśli ja to dobrze, IteratorIterator jest z punktu skryptowego widzenia bezużyteczny (gdy jest stosowany do foreach przynajmniej).

tworzy Iterateable Przedmioty z obiektów realizujących przesuwny interfejs, ale intern klasy implementujące interfejs przesuwny są foreachable skrypty i tak nie może implementować przesuwny ...

(Nie wymienione w dokumentacji, SimpleXMLElement implementuje Traversable)