Iterator

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

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

Iteratory wbudowane od PHP 5.1

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