上次继续给大家讲了PHPyield的用法,今天给大家讲讲yieldfrom。看到这里,一定是PHP.net读起来不爽。这篇文章一定要把yieldfrom语法给你解释的很透彻。三部曲yieldsyntaxexplorationyieldfromsyntaxexplorationyield实际的“多线程”编码语法$expression是必需的(yield可以为空或NULL),并且必须是可迭代对象。快速启动小示例1current()。PHP_EOL;$gen->next();echo'valueis:'。$gen->current().PHP_EOL;$gen->next();echo'valueis:'。$gen->current().PHP_EOL;$gen->next();运行输出$php./test.phpvalueis:1valueis:2valueis:3在小例子2中,当yieldfrom的右边是generator,调用next,current也可以将generator中的元素一一送出。小例子3current();echo'getre:'。$重新。PHP_EOL;$gen2->send(100);$re2=$gen2->current();echo'getre2:'。$re2。PHP_EOL;$gen2->send('world');$re3=$gen2->getReturn();回声'得到回报:'。$re3。PHP_EOL;操作流程图如下:看过我之间那篇文章的读者,这张图很眼熟,左边是上一张,最右边是新加的yield_from_func()。对比可见,外部调用yield_from_func()的current()和send()与直接调用yield_func()的current()和send()结果是一样的。yieldfrom就是原封不动地来回传递生成器的中间值。它是一个桥梁,current,send,next,可以通过它传入,也可以把里面yield的值传出去。接下来,让我们完整地找出并测试代码。giteePHPGeneratorYieldDemo,探究yieldfrom的各种细节。gitclonehttps://gitee.com/xupaul/PHP-generator-yield-Demo.git纸上谈兵很容易,但是得运行$php./yieldFromTest.php什么是生成器?//./yieldFromFunctions.phpfunctionyield_from_func1(){//yieldfrom;//Parseerror:syntaxerror,unexpected';'}有一行代码被注释了,语法静态检查无法通过。上图是generator判断运行的结果,yield_from_func4(),有一个if判断是否运行到yieldfrom,php还是判断为generator。其实到这里,大家就一目了然了,生成器是不是静态判断的。current();//致命错误:未捕获错误:只能将“yieldfrom”用于数组和TraversablesechoPHP_EOL;运行结果:eg:NO.5yield_from_func4是PHPGenerator?:truecallyield_from_func2current这个yield_from_func4虽然确定是generateddevice,但是一执行就会报错,而且yieldfrom右边必须是可遍历对象。示例8也将运行不正确。上面current、next和send的截图,例子1,例子2,可以看到yieldfrom和yield的current,获取当前值,nextskip,send将值传给generator,这些功能类似half的一代。同样,一开始就跳过current,直接调用send,会丢失第一个yield的弹出值。yieldfromreceiveddataexample:6,7.看例子6截图中getre:打印出$re为NULL,list($re1,$re2,$re3)也为NULL。结论:yieldfrom的左边不能接收到任何值,在左边写赋值语句不会报错,但也是没有意义的。那么send输入的值到哪里去了呢?继续看yieldfromnested'value';$arr[]=yield7=>'cc';$arr[]=收益5;echo'运行功能'.__功能__。'线:'。__线__。',回复:';变量导出($arr);echoPHP_EOL;}示例:在9和10中,我们实现了它,从生成器中取值。同时通过yield_func20函数中$arr变量的dump,发现发送给生成器的值会通过yieldfrom传递给内部生成器的yield赋值语句。例子:在12和13中,发现yieldfrom可以多层嵌套。yieldfrom的嵌套功能是一个非常重要的特性。在协程编码中,巧妙地使用嵌套可以减少函数指针和生成器的应用转移。综上所述,yieldfrom是一种功能强大且不可或缺的语法。如果只有yield,那么就只有generator。有了yieldfrom,就有了一根强大的“针”——穿过每一个生成器,根据调用栈把生成器一个一个串起来。使用call_user_func()调用方法,使用yieldfrom调用生成器。好了,yieldfrom的用法探索就到这里了,实战放在后续文章中。欢迎提问,如果有帮助请关注,收藏,作者有新发现,干货,会更新文章。
