Iterator
Z PHPEdia.pl
Spis treści |
Definicja
Iterator to obiekt pozwalający na sekwencyjny dostęp do wszystkich elementów lub części zawartych w innym obiekcie (np. iterator zwracający kolejne rekordy korzystając z rezultatu zapytania do bazy danych).
Założenia
- pozwala przetworzyć każdy element w kolekcji bez konieczności zagłębiania się w jej wewnętrzną strukturę
- pozwala przechowywać dane kolekcji w dowolny sposób, podczas gdy użytkownik może traktować ją jak zwykłą sekwencję lub listę
- możliwość użycia z pętlą foreach bez konwertowania do tablicy
dostępność
Iteratory występują w PHP od wersji 5.
Wbudowane iteratory
Wraz z Standardową biblioteką PHP dostajemy do użytku kilkanaście podstawowych rodzajów iteratorów.
Iteratory wbudowane od PHP 5.0
- RecursiveIterator (interfejs)
- RecursiveIteratorIterator (klasa)
- FilterIterator (klasa)
- ParentIterator (klasa)
- SeekableIterator (interfejs)
- LimitIterator (klasa)
- CachingIterator (klasa)
- DirectoryIterator (klasa)
- RecursiveDirectoryIterator (klasa)
- SimpleXMLIterator (klasa)
- ArrayIterator (klasa)
Iteratory wbudowane od PHP 5.1
- OuterIterator (interfejs)
- IteratorIterator (klasa)
- NoRewindIterator (klasa)
- EmptyIterator (klasa)
- InfiniteIterator (klasa)
- AppendIterator (klasa)
Przykłady użycia iteratorów
Lista plików w katalogu
Za pomocą funkcji scandir()
$files = scandir('directory'); foreach($files as $file) { echo $file; echo '<br/>'; }
Za pomocą iteratora DirectoryIterator
$iterator = new DirectoryIterator('directory'); foreach($iterator as $file) { echo $file->getFilename(); echo '<br/>'; }
Za pomocą rekursywnego iteratora RecursiveIteratorIterator
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('directory')); foreach($iterator as $file) { echo $file->getPathname(); echo '<br/>'; }
Iterowanie dowolnego obiektu
Każda klasa w PHP implementuje najprostszy iterator, który pozwala na przeglądanie wszystkich publicznych właściwości danej klasy wraz z ich wartościami dla danego obiektu. NaodW29-php7a6a6b6578a7040300000001 Skrypt wyświetli:
NaodW29-pre58eb3a383c3008bd00000001
Wartości właściwości Foo::$var2 i Foo::$var3 nie zostaną pokazane, ponieważ są one zdefiniowane jako niepubliczne.
Iterowanie obiektu klasy ArrayObject
Standardowa Biblioteka PHP oprócz iteratorów oferuje nam także wygodny i obiektowy sposób obsługi tablic, wprowadzając klasę ArrayObject. Dzięki temu, że klasa ta implementuje interfejs IteratorAggregate, możemy ją iterować za pomocą pętli foreach: NaodW29-php7a6a6b6578a7040300000002
Tworzenie własnych iteratorów
Każdą klasę możemy wyposażyć w iterator, dzięki czemu będziemy zamiast poruszania się po jej publicznych właściwościach, poruszać się po dowolnych zgromadzonych w niej danych. Klasa, która zwraca iterator musi implementować interfejs IteratorAggregate. Jako przykład stworzymy prostą klasę do obsługi bazy danych MySQL, która będzie zwracała rezultaty jako obiekty, które mogą być iterowane: NaodW29-php7a6a6b6578a7040300000003 Klasa MySQLDatebase to przykładowy sterownik MySQL. Dla potrzeb przykładu został on ograniczony do absolutnego minimum. Najważniejsza jest w niej metoda query, która zwraca nam rezultat zapytania opakowany w odpowiednią klasę MySQLResult, tzw. agregat, którego zadaniem jest zwracanie iteratora. Klasa MySQLResult implementuje interfejs IteratorAggregate, przez co musi być w niej zaimplementowana metoda getIterator(). To tą metodą posłuży się foreach, jeśli podamy obiekt klasy implementującej ten interfejs jako jego argument, by pobrać iterator, w tym przypadku klasę MySQLResultIterator. Klasa ta implementuje interfejs Iterator, co wymusza na programiście stworzenie w niej 5 metod, którymi można posłużyć się do przechodzenia między kolejnymi elementami iteratora (co robi pętla foreach). Oto przykład użycia tych klas: NaodW29-php7a6a6b6578a7040300000004
więcej informacji
Strona ta opisuje jeden z Wzorców projektowych.
Wzorce projektowe: Definicja | Zalety | Podział wzorców | Lista wzorców
