Der in diesem Artikel vorgestellte Inhalt befasst sich mit dem Verständnis des PHP-Generators. Jetzt kann ich ihn mit allen teilen, die ihn benötigen.
Nachdruck und zusammengestellt von: Jifan. Fengxue PHP-Handbuch
Generator
lösbare Probleme
Zitat aus der offiziellen Website: Generatoren bieten eine einfachere Möglichkeit, eine einfache Objektiteration zu implementieren, da der Leistungsaufwand und die Komplexität erheblich reduziert werden. Mit Generatoren können Sie Code in einen foreach-Block schreiben, um einen Datensatz zu durchlaufen, ohne ein Array im Speicher zu erstellen, was Ihre Speichergrenze erreichen würde (Hervorhebung hinzugefügt) oder erhebliche Verarbeitungszeit in Anspruch nehmen würde. Stattdessen können Sie eine Generatorfunktion schreiben, genau wie eine normale benutzerdefinierte Funktion, und statt einer normalen Funktion, die nur einmal zurückgibt, kann der Generator so oft wie nötig nachgeben, um die Werte zu generieren, über die iteriert werden muss.
Generate implementiert die Iterator-Schnittstelle
<?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 ) } ?>
Keyword yield
Der Kern der Generatorfunktion ist das Schlüsselwort yield. In seiner einfachsten Form sieht es aus wie eine Return-Anweisung, mit der Ausnahme, dass eine normale Return-Anweisung einen Wert zurückgibt und die Ausführung der Funktion beendet, während Yield einen Wert an den Code zurückgibt, der den Generator in einer Schleife umläuft und die Ausführung der Generatorfunktion einfach anhält . Ein Generator kann keinen Wert zurückgeben: Andernfalls wird ein Kompilierungsfehler generiert. Allerdings ist „return null“ eine gültige Syntax und beendet die Ausführung des Generators.
Yield kann nur in Funktionen verwendet werden, andernfalls wird ein schwerwiegender PHP-Fehler gemeldet: Der Ausdruck „yield“ kann nur innerhalb einer Funktion verwendet werden, wenn yield vorhanden ist Verwendet Alle Schlüsselwortfunktionen geben ein Generatorobjekt zurück. Jedes Mal, wenn der Code für die Yield-Anweisung ausgeführt wird, wird die Ausführung angehalten und der Wert des Ausdrucks in der Yield-Anweisung an das Generator-Objekt zurückgegeben. Wenn das Generator-Objekt weiter iteriert wird, wird der Code nach Yield weiterhin ausgeführt bis alle Yield-Anweisungen ausgeführt wurden oder eine Return-Anweisung vorhanden ist. Die Return-Anweisung kann nur null zurückgeben, d. h. return;, andernfalls tritt ein Kompilierungsfehler auf.
Verstehen Sie den Ausführungsprozess und die verfügbaren Funktionen anhand von Beispielen
1 Beispiel 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 Beispiel 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 表达式。
相关推荐:
Das obige ist der detaillierte Inhalt vonVerständnis des PHP-Generatorgenerators. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Was noch beliebt ist, ist die Benutzerfreundlichkeit, die Flexibilität und ein starkes Ökosystem. 1) Benutzerfreundliche und einfache Syntax machen es zur ersten Wahl für Anfänger. 2) eng integriert in die Webentwicklung, eine hervorragende Interaktion mit HTTP -Anforderungen und Datenbank. 3) Das riesige Ökosystem bietet eine Fülle von Werkzeugen und Bibliotheken. 4) Active Community und Open Source Nature passen sie an neue Bedürfnisse und Technologietrends an.

PHP und Python sind beide Programmiersprachen auf hoher Ebene, die häufig für die Aufgaben der Webentwicklung, Datenverarbeitung und Automatisierung verwendet werden. 1.PHP wird häufig verwendet, um dynamische Websites und Content -Management -Systeme zu erstellen, während Python häufig zum Erstellen von Webrahmen und Datenwissenschaften verwendet wird. 2.PHP verwendet Echo, um Inhalte auszugeben, Python verwendet Print. 3. Beide unterstützen die objektorientierte Programmierung, aber die Syntax und die Schlüsselwörter sind unterschiedlich. 4. PHP unterstützt eine schwache Konvertierung, während Python strenger ist. 5. Die PHP -Leistungsoptimierung umfasst die Verwendung von Opcache und asynchrone Programmierung, während Python Cprofile und asynchrone Programmierungen verwendet.

PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

PHP bleibt im Modernisierungsprozess wichtig, da es eine große Anzahl von Websites und Anwendungen unterstützt und sich den Entwicklungsbedürfnissen durch Frameworks anpasst. 1.PHP7 verbessert die Leistung und führt neue Funktionen ein. 2. Moderne Frameworks wie Laravel, Symfony und Codesigniter vereinfachen die Entwicklung und verbessern die Codequalität. 3.. Leistungsoptimierung und Best Practices verbessern die Anwendungseffizienz weiter.

PhPhas significantantyPactedWebDevelopmentAndendendsbeyondit.1) iTpowersMAjorPlatforms-LikewordpressandExcelsInDatabaseInteractions.2) php'SadaptabilityAllowStoscaleForLargeApplicationsfraMe-Linien-Linien-Linien-Linienkripte

PHP -Typ -Eingabeaufforderungen zur Verbesserung der Codequalität und der Lesbarkeit. 1) Tipps zum Skalartyp: Da Php7.0 in den Funktionsparametern wie int, float usw. angegeben werden dürfen. 3) Eingabeaufforderung für Gewerkschaftstyp: Da Php8.0 in Funktionsparametern oder Rückgabetypen angegeben werden dürfen. 4) Nullierstyp Eingabeaufforderung: Ermöglicht die Einbeziehung von Nullwerten und Handlungsfunktionen, die Nullwerte zurückgeben können.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung