Ce este
Șablonul Iterator parcurge o colecție fără a expune modul în care este stocată. Apelantul cere câte un element pe rând — dacă datele se află într-un tablou, într-un arbore sau într-o bază de date rămâne un detaliu privat.
PHP include șablonul direct în limbaj: foreach acceptă orice obiect care implementează interfața predefinită Iterator, iar un generator — o funcție cu yield — o implementează în locul tău. Pentru tablouri simple, foreach este deja iteratorul tău; șablonul contează atunci când stocarea este ascunsă sau parcurgerea este complicată.
Exemplu: parcurgerea unei liste de redare
Lista de redare își ține melodiile private. play() este un generator: oferă câte o melodie la fiecare tură a buclei — stocarea din spatele ei s-ar putea schimba complet fără să strice vreun apelant.
Un generator produce câte o melodie pe rând
Bucla nu atinge niciodată tabloul din interiorul listei de redare. Fiecare yield pune funcția în pauză până când foreach cere următoarea melodie. Înlocuiește tabloul cu o listă înlănțuită sau cu încărcare leneșă, iar această buclă va rula tot neschimbată.
Ieșire: script PHP
<?php
class Playlist {
/** @var string[] */
private array $songs;
public function __construct(string ...$songs) {
$this->songs = $songs;
}
// Un generator: se oprește la fiecare yield până când bucla cere din nou.
public function play(): \Generator {
foreach ($this->songs as $song) {
yield $song;
}
}
}
$playlist = new Playlist("intro", "verse", "chorus");
foreach ($playlist->play() as $song) {
echo "se redă: ", $song, "\n";
}
Când să îl folosești
Folosește-l atunci când interiorul colecției trebuie să rămână privat, când parcurgerea nu este banală (arbori, pagini de la un API) sau când elementele ar trebui produse leneș, câte unul pe rând.
Renunță la el pentru tablouri simple din codul tău — un foreach peste tablou este mai scurt, mai rapid și cunoscut de orice cititor.
Avantaje și dezavantaje
Avantaje: stocarea rămâne privată și poate fi schimbată; generatoarele fac un iterator dintr-o singură funcție; parcurgerea complicată este scrisă o singură dată.
Dezavantaje: mai multă mecanică decât o simplă parcurgere de tablou; un iterator activ peste o colecție care se modifică este o sursă clasică de erori subtile.