Maison >développement back-end >tutoriel php >Vous faire comprendre Generator en PHP
Recommandé : "Tutoriel vidéo PHP"
À partir de PHP 5.5, PHP a ajouté une nouvelle fonctionnalité, à savoir Generator
, Le La traduction chinoise est 生成器
. Les générateurs peuvent être simplement utilisés pour implémenter une itération d'objet. Commençons par un petit exemple officiel.
En PHP, nous savons tous qu'il existe une fonction appelée range
, qui est utilisée pour générer un tableau de séquences arithmétiques, et nous pouvons ensuite utiliser ce tableau pour effectuer foreach
itérer. Plus précisément, c'est ce que je veux faire.
foreach (range(1, 100, 2) as $num) { echo $num . PHP_EOL; }
Ce morceau de code produira une séquence arithmétique avec le premier terme étant 1, le dernier terme étant 100 et la tolérance étant 2. Sa séquence d'exécution est la suivante. Tout d'abord, range(1, 100, 2)
générera un tableau, qui stocke une séquence arithmétique comme ci-dessus, puis itérera ce tableau dans foreach
.
Alors, une question se pose, et si je veux générer 1 million de numéros ? Nous occuperons alors des centaines de mégaoctets de mémoire. Même si la mémoire est désormais très bon marché, nous ne pouvons pas la gaspiller ainsi. Alors à ce moment-là, notre générateur peut s’avérer utile. Considérez le code suivant.
function xrange($start, $limit, $step = 1) { while ($start <= $limit) { yield $start; $start += $step; } } foreach (xrange(1, 100, 2) as $num) { echo $num . PHP_EOL; }
Le résultat de ce code est exactement le même que le code précédent, mais son principe interne est complètement différent.
Comme nous venons de le dire, dans le code précédent, range
générera un tableau, puis foreach
parcourra le tableau pour extraire une certaine valeur. Mais dans ce code, nous avons redéfini une fonction xrange
, et dans la fonction, nous avons utilisé un mot-clé yield
. Nous savons tous que lorsque vous définissez une fonction et espérez qu'elle renvoie une valeur, utilisez return
pour la renvoyer. Donc ce yield
peut aussi renvoyer une valeur, mais c'est complètement différent de return
.
L'utilisation du mot-clé yield
permet d'interrompre la fonction pendant son exécution. En même temps, le contexte de toute la fonction sera enregistré et un objet de type Generator
sera renvoyé. Lorsque la méthode next
de l'objet est exécutée, le contexte au moment de l'interruption sera rechargé et continuera à s'exécuter jusqu'à ce que le prochain yield
apparaisse. Si aucun yield
n'apparaît plus tard, alors l'ensemble du générateur est considéré comme terminé.
De cette façon, notre appel de fonction ci-dessus peut être écrit de manière équivalente comme ceci.
$nums = xrange(1, 100, 2); while ($nums->valid()) { echo $nums->current() . "\n"; $nums->next(); }
Ici, $num
est un objet de Generator
. Nous voyons ici trois méthodes, valid
, current
et next
. Lorsque notre fonction a fini de s'exécuter et qu'il n'y a pas d'interruption yield
plus tard, alors notre fonction a fini de s'exécuter dans xrange
, alors la méthode valid
deviendra false
. Quant à current
, il renverra la valeur après le yield
actuel. Cela signifie que la fonction du générateur sera interrompue. Ensuite, après avoir appelé la méthode next
, la fonction continuera à s'exécuter jusqu'à ce que le prochain yield
apparaisse ou que la fonction se termine.
D'accord, nous voyons ici que yield
est utilisé pour "générer" une valeur et la renvoyer. En fait, yield
peut aussi s’écrire ainsi. Comme la valeur de retour, ici une valeur est transmise à la fonction lors de la poursuite de l'exécution de la fonction, qui peut être utilisée via $ret = yield;
. Par exemple. Generator::send($value)
function sum() { $ret = yield; echo $ret . PHP_EOL; } $sum = sum(); $sum->send('I am from outside.');De cette façon, le programme imprimera la chaîne transmise par la méthode
. Il peut y avoir des appels des deux côtés de send
en même temps. yield
function xrange($start, $limit, $step = 1) { while ($start <= $limit) { $ret = yield $start; $start += $step; echo $ret . PHP_EOL; } } $nums = xrange(1, 100, 2); while ($nums->valid()) { echo $nums->current() . "\n"; $nums->send($nums->current() + 1); }Et utilisé comme ça,
peut renvoyer le retour du suivant send()
. yield
, on peut utiliser yield
comme ça, voilà, on peut passer yield $id => $value
méthode pour obtenir key
, et la méthode $id
renvoie current
. $value
. La première fois que la méthode yield
est exécutée, send
sera appelée implicitement. rewind
En tant que nouvelle fonctionnalité de PHP 5.5, nous utilisons une nouvelle méthode pour itérer efficacement les données. En même temps, nous pouvons également utiliser yield
pour implémenter des coroutines. yield
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!