Generators
PHP Manual

Comparaison de générateurs avec des objets Iterator

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->fileHandle0);
        
$this->line fgets($this->fileHandle);
        
$this->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.


Generators
PHP Manual