Le principal avantage des générateurs est leur simplicité. Moins de codes compliqués doient être écrits par rapport à l'implémentation d'une classe Iterator, et le code est générallement plus lisible. Par exemple, la fonction et la classe suivante sont équivalents :
<?php
function getLinesFromFile($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}
while (false !== $line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);
}
// versus...
class LineIterator implements Iterator {
protected $fileHandle;
protected $line;
protected $i;
public function __construct($fileName) {
if (!$this->fileHandle = fopen($fileName, 'r')) {
throw new RuntimeException('Impossible d\'ouvrir le fichier : "' . $fileName . '"');
}
}
public function rewind() {
fseek($this->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this->i = 0;
}
public function valid() {
return false !== $this->line;
}
public function current() {
return $this->line;
}
public function key() {
return $this->i;
}
public function next() {
if (false !== $this->line) {
$this->line = fgets($this->fileHandle);
$this->i++;
}
}
public function __destruct() {
fclose($this->fileHandle);
}
}
?>
Cependant, cette fléxibilité a un coût : les générateurs sont des itérateurs n'allant que de l'avant, et ne peuvent pas être ré-initialisés une fois l'itération commencée. Cela signifie également que le même générateur ne peut pas être utilisé à plusieurs reprises : le générateur doit soit être reconstruit en appelant une nouvelle fois la fonction générateur, ou clôné via le mot clé clone.