Generator en PHP est une nouvelle fonctionnalité ajoutée depuis PHP5.5, traduite en chinois par "générateur" ; Generator fournit un moyen pratique d'implémenter un simple Iterator. L'utilisation de Generator pour implémenter Iterator ne nécessite pas la création d'une classe. hériter de l'interface Iterator.
Qu'est-ce que Generator
À partir de PHP 5.5, PHP a été ajouté Une nouvelle fonctionnalité est Generator
, qui est traduit en chinois par 生成器
.
Generator fournit un moyen pratique d'implémenter un Iterator simple. L'utilisation de Generator pour implémenter Iterator ne nécessite pas la création d'une classe pour hériter de l'interface Iterator.
Les générateurs peuvent être simplement utilisés pour implémenter l'itération d'objets. Commençons par un petit exemple officiel.
xrange
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 utilisez ceci Le tableau est itéré sur foreach
. Plus précisément, c'est ce que je veux faire.
foreach (range(1, 100, 2) as $num) { echo "{$num}\n"; }
Ce code affichera le premier élément Il est une suite arithmétique avec 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) { yield $start; $start++; }foreach (xrange(1, 100, 2) as $num) { echo "{$num}\n"; }
Le résultat de ce code, exactement le identique au morceau de code précédent, mais ses principes internes sont chamboulés.
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 Generator
objet. 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}\n"; } $sum = sum(); $sum->send('I am from outside.');
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) { $ret = yield $start; $start++; echo "{$ret}\n"; }
而像这样的使用,send()
可以返回下一个 yield
的返回。
其它的 Generator 方法
Generator::key()
对于 yield
,我们可以这样使用 yield $id => $value
,这是,我们可以通过 key
方法来获取 $id
,而 current
方法返回的是 $value
。
Generator::rewind()
这个方法,可以帮我们让生成器重新开始执行并保存上下文,同时呢,会返回第一个 yield
返回的内容。在第一次执行 send
方法的时候,rewind
会被隐式调用。
这个方法,向生成器中,抛送一个异常。
后记
yield
作为 PHP 5.5 的新特性,让我们用了新的方法来高效地迭代数据。同时,我们还可以使用 yield
来实现协程。
更多相关知识,请访问 PHP中文网!!
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!