Maison  >  Article  >  développement back-end  >  Qu'est-ce que le générateur en PHP

Qu'est-ce que le générateur en PHP

巴扎黑
巴扎黑original
2017-08-16 09:48:504791parcourir

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 le générateur en PHP

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.');
De cette façon, le programme imprimera out

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 会被隐式调用。

Generator::throw()

这个方法,向生成器中,抛送一个异常。

后记

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn