Cet article vous présente une analyse simple des générateurs PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Que sont les générateurs
Les générateurs vous permettent d'écrire du code dans un bloc foreach pour parcourir un ensemble de données sans créer de tableau en mémoire, qui atteindra votre limiter la mémoire ou prendre un temps de traitement considérable. Au lieu de cela, vous pouvez écrire une fonction génératrice, tout comme une fonction personnalisée normale, et au lieu qu'une fonction normale ne renvoie qu'une seule fois, le générateur peut produire autant de fois que nécessaire pour générer les valeurs qui doivent être itérées.
Un exemple simple consiste à utiliser un générateur pour réimplémenter la fonction range(). La fonction standard range() doit générer un tableau en mémoire contenant toutes les valeurs comprises dans sa plage, puis renvoyer le tableau, ce qui donne lieu à plusieurs grands tableaux. Par exemple, l’appel de range(0, 10000) entraînera une utilisation de la mémoire supérieure à 4 Mo.
Exemple de code :
<?php /** * Created by PhpStorm. * User: chenbotome@163.com * Date: 2018/7/30 * Time: 上午11:29 */ $start = xdebug_memory_usage(); $num = 10000; function rangeWithGenerators($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException('Step must be +ve'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('Step must be -ve'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } } if ($argc === 1) { $iterate = rangeWithGenerators(0, $num, 1); foreach ($iterate as $value){ echo $value . "\n"; } //var_dump(iterator_to_array($iterate)); } if ($argc === 2) { $test = range(0, $num, 1); foreach ($test as $value) { echo $value . "\n"; } } $end = xdebug_memory_usage(); echo sprintf("内存消耗量%s\n", convert($end-$start)); function convert($size){ $unit=array('b','kb','mb','gb','tb','pb'); return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; }
Environnement
PHP7.1
Montant 416 b
php test.php plage Résultat retour : Consommation mémoire 4 Mo
Grâce à l'exécution du code, comparez les similitudes et les différences entre la fonction standard PHP rang() et la fonction personnalisée rangeWithGenerators(). Atteignant le même objectif mais consommant une mémoire différente, les avantages du générateur sont évidents.
rangeWithGenerators() utilise un générateur, et la clé du générateur est d'utiliser le mot-clé rendement. L'utilisation courante de rendement implique deux instructions de contrôle de flux, foreach et for. La variable de rendement $i dans la boucle for de rangeWithGenerators() (le rendement peut être compris comme la génération d'une valeur, tout comme le retour peut être compris comme le retour d'une valeur). La fonction
foreach boucle les générateurs. Dans cet exemple, cette méthode est utilisée pour lire les générateurs.
Fonction standard PHP iterator_to_array(), cette fonction convertit les générateurs en un tableau.
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!