This article brings you a simple understanding of the generator under PHP (code analysis). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.
Generator class
# http://php.net/manual/zh/class.generator.php Generator implements Iterator { /* Methods */ //获取迭代器当前值 public mixed current ( void ) //获取迭代器当前值 public mixed getReturn ( void ) //返回当前产生的键 public mixed key ( void ) //生成器从上一次yield处继续执行 public void next ( void ) //重置迭代器 public void rewind ( void ) //向生成器中传入一个值 public mixed send ( mixed $value ) //向生成器中抛入一个异常 public mixed throw ( Throwable $exception ) //检查迭代器是否被关闭 public bool valid ( void ) //迭代器序列化时执行的方法 public void __wakeup ( void ) }
Generate generator
Try to instantiate the class
$gen = new Generator(); # 我们发现不能直接手动实例化 # output PHP Fatal error: Uncaught Error: The "Generator" class is reserved for internal use and cannot be manually instantiated in /web/www/sxx_admin3/src/cache/test/amphp/gen3.php:8
Try the function method
function gen($max) { for ($i=0; $i<h2 id="Understand-the-generation-of-php-Generator">Understand the generation of php Generator</h2><p>In fact, each language has a generator, such as python, go, etc.</p><h3 id="Generator-iteration-foreach">Generator iteration foreach</h3><p> The code will demonstrate valid, getReturn</p><pre class="brush:php;toolbar:false">function gen($max) { for ($i=0; $i= 0 && !$gen->valid()) { var_dump($gen->getReturn()); }
Generator iteration with key value foreach
The iterator return value can have key and value, similar to
function gen($max) { for ($i=0; $i $i+1; } return $max; } $gen = gen(5); //var_dump($gen->key()); //var_dump($gen->current()); foreach ($gen as $key=>$val) { var_dump($key . "=>" . $val); } # output string(4) "0=>1" string(4) "1=>2" string(4) "2=>3" string(4) "3=>4" string(4) "4=>5"
Generator iteration manual iteration
This code will demonstrate rewind, next , send method
function gen($max) { for ($i=0; $irewind(); // 打印获取到当前生成器的值 var_dump("1::" . $gen->current()); //output: string(4) "1::0" // 下面2句代码执行,将返回错误 // $gen->next(); // $gen->rewind(); //继续执行,知道遇到下一个yield $gen->next(); var_dump("2::" . $gen->current()); //output: string(4) "2::1" $gen->next(); var_dump("3::" . $gen->current()); //output: string(4) "3::2" // send传null值等同于调用next(本方法尝试来自python的迭代器,成功) $gen->send(null); var_dump("4::" . $gen->current()); //output: string(4) "4::3" // send传值会也会继续执行 $gen->send(100); var_dump("5::" . $gen->current()); //output: string(4) "5::4" //如果已经迭代完成,获取返回值 // php7 支持 if (version_compare(PHP_VERSION, '7.0.0') >= 0 && !$gen->valid()) { var_dump($gen->getReturn()); } # output: string(4) "1::0" NULL string(4) "2::1" NULL string(4) "3::2" NULL string(4) "4::3" int(100) string(4) "5::4" # 我们先不去理会gen里var_dump输出的NULL或int(100) # 我们先去理解每次next后current可以获取到当前yield的值即可
Try to understand send output
function gen($max) { for ($i=0; $icurrent()); $gen->send(222); var_dump("2::" . $gen->current()); $gen->send(333); var_dump("3::" . $gen->current()); $gen->send(null); var_dump("4::" . $gen->current()); # output: string(4) "1::0" int(222) string(4) "2::1" int(333) string(4) "3::2" int(444) string(4) "4::3" # send和next # next() => current = yield值 # send(val) $rs = yield 表达式执行 = val; //send这样理解即可 # 在当前某个yield处时send,当前yield表达式处返回,如果没有变量接收,那么继续下一个yield处返回 $rs = (yield somethind_to_do(...) ); ^ |-------------------| | yield值 | |----------------------------| | yield 表达式 yield表达式结果 # 执行顺序流程类似 $res = (yield 1); // current()); 第一步到yield返回 var_dump($res); // send(222); 第二步send:222后,继续往下走$res=222 然后var_dump($res), 然后到了yield 2 $res = (yield 2); // current()); 打印当前的值2 var_dump($res); // send(333); 第三步send:333后,继续往下走$res=333 然后var_dump($res), 然后到了yield 3 $res = (yield 3); // current()); var_dump($res); // send(null); 第二步send:null后,继续往下走$res=null 然后var_dump($res), 然后到了yield 4 $res = (yield 4); // current());
Summary
For first introduction, we only need to understand next and send first
next-> Let us Active automatic execution of iterators
send-> allows our iterators to achieve two-way communication and change the order of the execution body process
We will introduce usage scenarios and Co automatic execution bodies later
The above is the detailed content of A simple understanding of generators under PHP (code analysis). For more information, please follow other related articles on the PHP Chinese website!

APHPDependencyInjectionContainerisatoolthatmanagesclassdependencies,enhancingcodemodularity,testability,andmaintainability.Itactsasacentralhubforcreatingandinjectingdependencies,thusreducingtightcouplingandeasingunittesting.

Select DependencyInjection (DI) for large applications, ServiceLocator is suitable for small projects or prototypes. 1) DI improves the testability and modularity of the code through constructor injection. 2) ServiceLocator obtains services through center registration, which is convenient but may lead to an increase in code coupling.

PHPapplicationscanbeoptimizedforspeedandefficiencyby:1)enablingopcacheinphp.ini,2)usingpreparedstatementswithPDOfordatabasequeries,3)replacingloopswitharray_filterandarray_mapfordataprocessing,4)configuringNginxasareverseproxy,5)implementingcachingwi

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

TomakePHPapplicationsfaster,followthesesteps:1)UseOpcodeCachinglikeOPcachetostoreprecompiledscriptbytecode.2)MinimizeDatabaseQueriesbyusingquerycachingandefficientindexing.3)LeveragePHP7 Featuresforbettercodeefficiency.4)ImplementCachingStrategiessuc

ToimprovePHPapplicationspeed,followthesesteps:1)EnableopcodecachingwithAPCutoreducescriptexecutiontime.2)ImplementdatabasequerycachingusingPDOtominimizedatabasehits.3)UseHTTP/2tomultiplexrequestsandreduceconnectionoverhead.4)Limitsessionusagebyclosin

Dependency injection (DI) significantly improves the testability of PHP code by explicitly transitive dependencies. 1) DI decoupling classes and specific implementations make testing and maintenance more flexible. 2) Among the three types, the constructor injects explicit expression dependencies to keep the state consistent. 3) Use DI containers to manage complex dependencies to improve code quality and development efficiency.

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 English version
Recommended: Win version, supports code prompts!

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

Dreamweaver CS6
Visual web development tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Mac version
God-level code editing software (SublimeText3)
