Maison  >  Article  >  développement back-end  >  Vous faire comprendre Generator en PHP

Vous faire comprendre Generator en PHP

藏色散人
藏色散人avant
2020-11-25 15:40:163645parcourir

Recommandé : "Tutoriel vidéo PHP"

Qu'est-ce que Generator

À 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.

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 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

Autres méthodes Generator

Generator::key()

Pour

, 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

Generator::rewind()

Cette méthode peut nous aider à redémarrer l'exécution du générateur et à enregistrer le contexte. En même temps, elle renverra le contenu renvoyé par le premier

. La première fois que la méthode yield est exécutée, send sera appelée implicitement. rewind

Generator::throw()

Cette méthode lève une exception au générateur.

Postscript

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer