Itérer sur de grandes quantités de données à l'aide de structures de boucles (telles que foreach) nécessitera beaucoup de mémoire et un temps de traitement considérable. Utilisez Generators pour parcourir un ensemble de données sans cette surcharge. Les fonctions du générateur sont comme les fonctions ordinaires. Cependant, au lieu d'une instruction return dans la fonction, le générateur est exécuté à plusieurs reprises en utilisant le mot-clé yield pour fournir les valeurs sur lesquelles itérer.
Le mot-clé rendement est au cœur du mécanisme générateur. Bien que son utilisation ressemble à return, elle n’arrête pas l’exécution de la fonction. Il fournit la valeur suivante de l'itération et met en pause l'exécution de la fonction.
Generator implements Iterator { /* Methods */ public current ( void ) : mixed public getReturn ( void ) : mixed public key ( void ) : mixed public next ( void ) : void public rewind ( void ) : void public send ( mixed $value ) : mixed public throw ( Throwable $exception ) : mixed public valid ( void ) : bool public __wakeup ( void ) : void }
public Generator::current ( void ) − mix — Récupère la valeur générée
public Generator::getReturn ( void ) : mix — Récupère la valeur de retour du générateur
public Generator::key ( void ) − mix — Obtenez la clé de la valeur générée.
p>public Generator::next ( void ) − void — Reprise de l'exécution du générateur. L'effet est le même que si vous appeliez Generator::send() avec NULL comme argument.
public Generator::rewind ( void ) − void — Rembobine l'itérateur. Cela lèvera une exception si l'itération a déjà commencé.
public Generator::send (mixed $value) : mix - Envoie la valeur donnée au générateur en tant que résultat de l'expression de rendement actuelle et restaure le générateur.
public Generator::throw ( Throwable $exception ) − mix — Lance une exception dans le générateur et reprend l'exécution du générateur.
public Generator::valid ( void ) − bool — Vérifie si l'itérateur a été fermé
public Generator::__wakeup ( void ) − void — Déclenche une exception car le générateur ne peut pas être sérialisé.
La classe Generator implémente l'interface Iterator. Les objets générateurs ne peuvent pas être instanciés via new. Toute fonction définie par l'utilisateur avec le mot-clé rendement crée un objet de la classe générateur.
Étant donné que le générateur implémente l'interface Iterator, chaque boucle peut être utilisée pour parcourir les valeurs générées.
Démonstration en direct
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); foreach ($gen as $val){ echo $val . " "; } ?>
Le programme ci-dessus affiche la sortie suivante
1 4 9 16 25
L'exemple suivant utilise les méthodes current() et next() de la classe générateur pour parcourir les valeurs générées. Utilisez la méthode valid() pour vérifier les conditions de la boucle.
Démonstration en direct
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); while ( $gen->valid() ){ echo "key: " . $gen->key(). " value: ". $gen->current() . ""; $gen->next(); } ?>
Le programme ci-dessus montre la sortie suivante
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!