Maison  >  Article  >  développement back-end  >  Qu'est-ce qu'un générateur en PHP ? Comment utiliser ?

Qu'est-ce qu'un générateur en PHP ? Comment utiliser ?

青灯夜游
青灯夜游avant
2021-09-27 20:12:223662parcourir

Que faire en Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ? ? Comment utiliser ? L'article suivant vous donnera une explication détaillée des générateurs en Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?, j'espère qu'il vous sera utile !

Qu'est-ce qu'un générateur en PHP ? Comment utiliser ?

Quand il s'agit de conduite, la vitesse n'est pas tout. Mais sur le Web, la vitesse fait toute la différence. Plus votre application est rapide, meilleure est l’expérience utilisateur. Cet article concerne les générateurs Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?, alors pourquoi parlons-nous de vitesse ? Vous découvrirez rapidement que les générateurs jouent un rôle énorme dans la gestion de la vitesse et de la mémoire.

Qu'est-ce que le générateur Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ? ?

Les générateurs ont été ajoutés dans Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ? 5.5 et fournissent un moyen simple de parcourir les données sans créer de tableaux en mémoire. Êtes-vous un peu confus? Donnez ensuite un exemple pour montrer que l’utilisation de générateurs est un bon moyen.

Tout d'abord, créez un fichier generator.php qui sera utilisé tout au long de notre exemple. Après avoir créé le fichier, nous ajoutons un morceau de code.

<?php function getRange ($max = 10) {
    $array = [];

    for ($i = 1; $i < $max; $i++) {
        $array[] = $i;
    }

    return $array;
}

foreach (getRange(15) as $range) {
    echo "Dataset {$range} <br>";
}

Nous pouvons rapidement démarrer un serveur Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ? intégré dans le répertoire où le fichier generator.php est créé :

php -S localhost:8000

Si vous ouvrez http://localhost:8000/generator.php avec un navigateur, nous devrions voyez quelque chose comme ceci Résultat :

Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?

Ce code n'est pas très explicite. Modifions un peu le code

<?php foreach (getRange(Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX) as $range) {
    echo "Dataset {$range} <br>";
}

Maintenant, la valeur maximale que le code ci-dessus peut générer est Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX (c'est-à-dire Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?). peut générer une valeur maximale). Lorsque nous actualisons le navigateur après avoir effectué cette modification, nous remarquons que quelque chose est différent cette fois. Ce script générateur renvoie un message d'avertissement

Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?

C'est dommage que Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ? ait manqué de mémoire. Je peux penser à augmenter la limite supérieure de memory_limit dans le fichier php.ini Mais pour être honnête, ce script est à la fois inefficace et gourmand en mémoire.

Utilisation de générateurs

Définissons la même fonction ci-dessus, appelons-la avec la même valeur Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX et exécutons-la à nouveau. Mais cette fois nous allons créer une fonction génératrice.

<?php function getRange ($max = 10) {
    for ($i = 1; $i < $max; $i++) {
        yield $i;
    }
}

foreach (getRange(Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX) as $range) {
    echo "Dataset {$range} <br>";
}

En analysant la fonction getRange, cette fois, nous parcourons uniquement les valeurs et la sortie yield. yield est similaire à la valeur de retour dans la mesure où il renvoie également une valeur d'une fonction, mais la seule différence est que yield ne renverra une valeur qu'en cas de besoin et n'essaiera pas de convertir l'intégralité de l'ensemble de données reste en mémoire. getRange 函数,这次,我们只循环遍历值和  yield 输出。 yield 与返回值类似,因为它也是从函数返回一个值,但唯一的区别是  yield 只会在需要时返回一个值,并且不会尝试将整个数据集保留在内存中。

如果您转到浏览器,您应该会看到页面上显示的数据。给定适当的时间,浏览器最终显示数据。

注意: 生成器只能在函数中使用。

为什么要使用生成器

有时候,我们可能会遇到想要解析一个庞大的数据集(也可能是日志文件),也可能对一个大型数据库的结果集执行计算,等等情况。我们不想让这些数据全部加载到内存中。我们应该尽可能的保存相应的内存状态。数据不一定要很大——无论数据有多小,生成器都是有效的。别忘了,我们的目的是使用更少的内存来尽可能快的处理数据。

返回键值对

有时候,我们的数据是基于 key-value 时才更有说服力。使用生成器时,我们可能会生成下面这样的键值对。

<?php function getRange ($max = 10) {
    for ($i = 1; $i < $max; $i++) {
        $value = $i * mt_rand();

        yield $i => $value;
    }
}

然后,我们可以使用这个键值对,就像使用任意的数组一样。

<?php foreach (getRange(Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX) as $range => $value) {
    echo "Dataset {$range} has {$value} value<br>";
}

传递参数到生成器中

生成器也能接收传参。这意味这生成器允许我们向其中注入参数,作为一个命令或者其他作用。例如,我们向生成器发送一个值,让它停止执行或者修改输出结果。使用上面的 getRange

Si vous accédez à votre navigateur, vous devriez voir les données affichées sur la page. Compte tenu du moment opportun, le navigateur finit par afficher les données.

Remarque : Les générateurs ne peuvent être utilisés que dans les fonctions.

Pourquoi utiliser des générateurs

Parfois, nous pouvons rencontrer des situations dans lesquelles nous souhaitons analyser un énorme ensemble de données (peut-être un fichier journal), ou effectuer des calculs sur l'ensemble de résultats d'une grande base de données, etc. Nous ne voulons pas que toutes ces données soient chargées en mémoire. Nous devons sauvegarder autant que possible l’état de la mémoire correspondant. Il n'est pas nécessaire que les données soient volumineuses : le générateur est efficace, quelle que soit la taille des données. N'oubliez pas que notre objectif est d'utiliser moins de mémoire pour traiter les données le plus rapidement possible.

Renvoyer les paires clé-valeurParfois, nos données sont plus convaincantes lorsqu'elles sont basées sur la valeur-clé. Lors de l'utilisation d'un générateur, nous pouvons générer des paires clé-valeur comme celles-ci.

<?php function getRange ($max = 10) {
    for ($i = 1; $i < $max; $i++) {
        $injected = yield $i;

        if ($injected === &#39;stop&#39;) return;
    }
}
Ensuite, nous pouvons utiliser cette paire clé-valeur comme n'importe quel tableau.
<?php $generator = getRange(Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX);

foreach ($generator as $range) {
    if ($range === 10000) {
        $generator->send('stop');
    }

    echo "Dataset {$range} <br>";
}
Passer les paramètres au générateur

Le générateur peut également recevoir des paramètres. Cela signifie que le générateur nous permet d'y injecter des paramètres, sous forme de commande ou d'autres fonctions. Par exemple, on envoie une valeur au générateur pour arrêter son exécution ou modifier sa sortie. En utilisant la fonction getRange ci-dessus, nous pouvons y parvenir.

rrreee
Pour envoyer injecter cette valeur, nous pouvons faire ceci.

rrreee

🎜Remarque :🎜L'utilisation du retour dans le générateur fera sortir du générateur. 🎜🎜N'abusez pas des générateurs🎜🎜Bien qu'utiliser 🎜Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX🎜 soit un peu exagéré Mais pour moi, 🎜Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ?_INT_MAX🎜 est 🎜2147483647🎜 qui est : 🎜🎜🎜deux milliards quarante-sept millions quatre cent quarante-huit. millions Trois mille six cent quarante sept 🎜🎜🎜Les générateurs rendent l'utilisation de la mémoire plus efficace. Mais si on en abuse, cela peut aussi causer des problèmes de mémoire. 🎜

Résumé

Les générateurs offrent des améliorations de performances significatives qu'il est difficile d'ignorer. La plupart du temps, nous n'avons pas besoin d'un serveur à configuration élevée pour exécuter le code. Nous avons juste besoin de faire un peu de refactoring, les générateurs sont très utiles, nous devrions les utiliser davantage

Adresse originale en anglais : https://scotch.io/tutorials/understanding-php-generators

Étude recommandée : " Quest-ce quun générateur en Quest-ce quun générateur en PHP ? Comment utiliser ? ? Comment utiliser ? tutoriel vidéo

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