Le contenu présenté dans cet article concerne la compréhension de PHP Generator. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
Réimprimé et compilé à partir de : Jifan, Manuel PHP Fengxue
Générateur
Problèmes résolubles
Cité sur le site officiel : Les générateurs offrent un moyen plus simple d'implémenter une itération d'objet simple Par rapport à la définition d'une classe pour implémenter l'interface Iterator, la surcharge de performances et la complexité sont considérablement réduites. 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, ce qui atteindrait votre limite de mémoire (c'est nous qui soulignons) ou prendrait 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.
Generate implémente l'interface Iterator
<?php //生成器 Generator implements Iterator { //返回当前产生的值 public mixed current ( void ) //返回当前产生的键 public mixed key ( void ) //生成器继续执行 public void next ( void ) //重置迭代器,如果迭代已经开始了,这里会抛出一个异常。 public void rewind ( void ) //向生成器中传入一个值,当前yield接收值,然后继续执行下一个yield public mixed send ( mixed $value ) //向生成器中抛入一个异常 public void throw ( Exception $exception ) //检查迭代器是否被关闭,已被关闭返回 FALSE,否则返回 TRUE public bool valid ( void ) //序列化回调 public void __wakeup ( void ) //返回generator函数的返回值,PHP version 7+ public mixed getReturn ( void ) } ?>
Rendement des mots clés
Le cœur de la fonction génératrice est le mot-clé rendement. Dans sa forme la plus simple, cela ressemble à une instruction return, sauf qu'un return normal renvoie une valeur et termine l'exécution de la fonction, tandis que rendement renvoie une valeur au code qui boucle autour du générateur et met simplement en pause l'exécution de la fonction génératrice. . Un générateur ne peut pas renvoyer de valeur : cela générera une erreur de compilation. Cependant, return null est une syntaxe valide et mettra fin à l'exécution du générateur.
Yield ne peut être utilisé que dans des fonctions, sinon une erreur fatale PHP sera signalée : L'expression "yield" ne peut être utilisée qu'à l'intérieur d'une fonction, chaque fois que rendement est utilisé Toutes les fonctions de mots-clés renverront un objet Générateur. Chaque fois que le code est exécuté dans l'instruction rendement, l'exécution sera suspendue et la valeur de l'expression dans l'instruction rendement sera renvoyée à l'objet Générateur. Lorsque vous continuez à itérer l'objet Générateur, le code après rendement continuera à être exécuté. jusqu'à ce que toutes les instructions rendement soient exécutées ou qu'il y ait une instruction return. Cette instruction renturn ne peut renvoyer que null, c'est-à-dire return;, sinon une erreur de compilation se produira.
Comprendre le processus d'exécution et les fonctions utilisables à partir d'exemples
1 Exemple 1
<?php function xrang($start, $end, $step=1){ for($i=$start; $i<=$end; $i += $step) { yield $i; //yield关键字定义了中断点 } } //foreach (xrang(1, 10000) as $num) { // echo $num."\n"; //} $rang = xrang(1,2); var_dump($rang).PHP_EOL; //输出: object(Generator)#1 (0) {} var_dump($rang instanceof Iterator).PHP_EOL; //输出: bool(true) $key = $rang->key(); var_dump("key: ".$key).PHP_EOL; //输出: string(6) "key: 0" $valid = $rang->valid(); var_dump("valid: ".$valid).PHP_EOL; //输出: string(8) "valid: 1" $current = $rang->current(); var_dump("current: ".$current).PHP_EOL; //输出: string(10) "current: 1" $rang->next(); $key = $rang->key(); var_dump("key: ".$key).PHP_EOL; //输出: string(6) "key: 1" $valid = $rang->valid(); var_dump("valid: ".$valid).PHP_EOL; //输出: string(8) "valid: 1" $current = $rang->current(); var_dump("current: ".$current).PHP_EOL; //输出: string(10) "current: 2" $rang->next(); $key = $rang->key(); var_dump("key: ".$key).PHP_EOL; //输出: string(5) "key: " $valid = $rang->valid(); var_dump("valid: ".$valid).PHP_EOL; //输出: string(7) "valid: " //$rang->rewind(); //重置,目前看到的所有文档中,rewind()仅在第一次调用Generator的时候隐式执行。生成器开始迭代后调用会抛出Fatal error。 ?>
2 Exemple 2
<?php function gen(){ echo "1111\n"; $ret = (yield 'yield1'); var_dump($ret); echo "2222\n"; $ret = (yield 'yield2'); var_dump($ret); //return; } $gen = gen(); var_dump($gen->current()).PHP_EOL; $a = $gen->send('ret1'); echo "66666\n"; var_dump($a).PHP_EOL; echo "77777\n"; var_dump($gen->valid()).PHP_EOL; $b = $gen->send('ret2'); var_dump($b).PHP_EOL; var_dump($gen->valid()).PHP_EOL; //1111 //string(6) "yield1" //string(4) "ret1" //2222 //66666 //string(6) "yield2" //77777 //bool(true) //string(4) "ret2" //NULL //bool(false) ?>
2.1 执行过程为:
1.首先调用gen(),进入函数输出1111,执行到第一个yield关键字所在的位置中断(此时yield表达式的值为定义的"yield1",使用current()获取当前表达式的值即得到string(6) "yield1")
2.调用send()方法向生成器中传入值"ret1"(传入生成器的值.这个值将会被作为生成器当前所在的 yield 的返回值),此时生成器从当前所在的yield表达式开始迭代,程序继续往下执行
3.遇到var_dump输出当前表达式的值"ret1",继续执行输出2222
4.继续执行,程序来到第二个yield中断点,此时表达式的值为定义值"yield2",因为调用的是send()方法,该方法返回当前所在的yield的值(current()方法值)。(查看send方法的官方文档)
5.$a获取到send方法的返回值即"yield2",继续执行输出"66666", $a, "77777"
6.输出当前生成器是否可用
7.继续执行,向生成器中传入值"ret2",生成器开始继续迭代。此时生成器位于第二个yield表达式,该表达式接受"ret2"作为返回值赋予变量$ret,打印得到string(4) "ret2"。
8.打印之后,$b == NULL,为NULL的原因因为未彻底理解清楚(疑问之处在于此时的send()方法到底有没有返回NULL),猜测可能有如下两个原因:
8.1 一者可能是因为生成器之后没有中断点,也没有返回值(返回值不被允许,或者说仅允许返回return; return;用于终止生成器的执行),$gen->send()方法根本就没有返回任何东西,导致$b == NULL
8.2 二者可能是$gen->send('ret2')传入值后,生成器迭代完本次的yield,隐式调用了next()和current(),又因为next()下面没有yield中断点使得current()返回NULL,导致send()返回值为NULL
8.3 根据上下文,二的可能性更大
2.2 关于send()方法
send()向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器不在 yield 表达式,那么在传入值之前,它会先运行到第一个 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!

Ce qui est encore populaire, c'est la facilité d'utilisation, la flexibilité et un écosystème fort. 1) La facilité d'utilisation et la syntaxe simple en font le premier choix pour les débutants. 2) étroitement intégré au développement Web, excellente interaction avec les demandes HTTP et la base de données. 3) L'énorme écosystème fournit une multitude d'outils et de bibliothèques. 4) La nature active et la nature open source les adaptent à de nouveaux besoins et tendances technologiques.

PHP et Python sont tous deux des langages de programmation de haut niveau qui sont largement utilisés dans le développement Web, le traitement des données et les tâches d'automatisation. 1.Php est souvent utilisé pour créer des sites Web dynamiques et des systèmes de gestion de contenu, tandis que Python est souvent utilisé pour créer des cadres Web et une science des données. 2.PHP utilise Echo pour sortir du contenu, Python utilise l'impression. 3. Les deux prennent en charge la programmation orientée objet, mais la syntaxe et les mots clés sont différents. 4. PHP prend en charge la conversion de type faible, tandis que Python est plus strict. 5. L'optimisation des performances PHP comprend l'utilisation de la programmation OPCACH et asynchrone, tandis que Python utilise la programmation CPROFILE et asynchrone.

PHP est principalement la programmation procédurale, mais prend également en charge la programmation orientée objet (POO); Python prend en charge une variété de paradigmes, y compris la POO, la programmation fonctionnelle et procédurale. PHP convient au développement Web, et Python convient à une variété d'applications telles que l'analyse des données et l'apprentissage automatique.

PHP est originaire en 1994 et a été développé par Rasmuslerdorf. Il a été utilisé à l'origine pour suivre les visiteurs du site Web et a progressivement évolué en un langage de script côté serveur et a été largement utilisé dans le développement Web. Python a été développé par Guidovan Rossum à la fin des années 1980 et a été publié pour la première fois en 1991. Il met l'accent sur la lisibilité et la simplicité du code, et convient à l'informatique scientifique, à l'analyse des données et à d'autres domaines.

PHP convient au développement Web et au prototypage rapide, et Python convient à la science des données et à l'apprentissage automatique. 1.Php est utilisé pour le développement Web dynamique, avec une syntaxe simple et adapté pour un développement rapide. 2. Python a une syntaxe concise, convient à plusieurs champs et a un écosystème de bibliothèque solide.

PHP reste important dans le processus de modernisation car il prend en charge un grand nombre de sites Web et d'applications et d'adapter les besoins de développement via des cadres. 1.Php7 améliore les performances et introduit de nouvelles fonctionnalités. 2. Des cadres modernes tels que Laravel, Symfony et Codeigniter simplifient le développement et améliorent la qualité du code. 3. L'optimisation des performances et les meilleures pratiques améliorent encore l'efficacité de l'application.

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

Le type PHP invite à améliorer la qualité et la lisibilité du code. 1) Conseils de type scalaire: Depuis PHP7.0, les types de données de base sont autorisés à être spécifiés dans les paramètres de fonction, tels que INT, Float, etc. 2) Invite de type de retour: Assurez la cohérence du type de valeur de retour de fonction. 3) Invite de type d'union: Depuis PHP8.0, plusieurs types peuvent être spécifiés dans les paramètres de fonction ou les valeurs de retour. 4) Invite de type nullable: permet d'inclure des valeurs nulles et de gérer les fonctions qui peuvent renvoyer les valeurs nulles.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

PhpStorm version Mac
Le dernier (2018.2.1) outil de développement intégré PHP professionnel

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP