其实我不知道yield是因为迭代或者生成器或者学习PHP手册。要不是协程,我到现在都不知道PHP中还有这么个鬼东西。事物。人们从PHP5.5开始就引入了这个东西,正式名称叫generator。你想说为什么5.5年的东西现在才拿出来。还想问你,PHP5.3有命名空间,也是最近几年才正式投产的。那么,问题来了,这个东西是干什么用的?先感受一个问题,给你100Kb的内存(是的,你没看错,就是100Kb),然后让你迭代输出一个从1到10000的数组,步长为1。越早迭代一个数组,必须首先创建数组。于是,敲了敲脑门,代码如下:',';}$end_mem=memory_get_usage();echo“使用内存:”。($end_mem-$start_mem).'bytes'.PHP_EOL;操作猛如虎,结果1-5平。大家感受一下:528440bytes,大概528Kb,差不多是100Kb的五倍,真是他妈的一天。毕竟你也知道最近内存的价格真的很贵,国家也在呼吁低碳节能减排。如果你多消耗5倍的内存,就意味着你会排放5倍多的二氧化碳,这意味着要花更多的钱来为内存的多用途做出贡献。给棍子……你知道,那是棍子。人们被迫离开,所以yield可以来拯救。大致代码如下,注意操作:收益$开始;}}foreach(yield_range(0,9999)as$item){echo$item.',';}$end_mem=memory_get_usage();echo“使用内存:”。($end_mem-$start_mem).'bytes'.PHP_EOL;运行一下,可以感受一下:首先我们观察一下yield_range函数和普通函数的区别,就是普通函数经常使用return来返回结果,而这个中间就是yield。二是普通函数中的return只能返回一次,而这个yield可以返回多次。那么,我们来分析一下这个神奇的yield_range函数。yield关键字究竟返回什么?让我们快速看一下:valid()){echo$generator->current().PHP_EOL;$generator->next();}运行结果如下:重点来了:这个yield_range函数好像能记住上次运行的位置。一次运行的结果是什么,然后下一次运行从上次停止的地方继续。这不是普通的PHP函数能做到的!我们知道,操作系统在调度进程时,会触发一个概念,叫做“进程上下文切换”。比如CPU从A进程调度到B进程,那么再从B进程调度到A进程时,A进程一开始跑到哪里去了,临时数据的结果是什么?从一开始,就会有很大的问题。但是,yield关键字似乎可以在用户态(非系统内核级)实现这个概念。所以,用yield来迭代,大概真的是个没用的东西,能干的事情太多了。接下来,我们需要知道一个名为send的生成器对象的方法。简单看下面的代码:send($generator->current()*10);运行结果如图:send方法可以修改yield的返回值,但是你不能想当然。比如下面的代码,你认为运行的结果会是什么?send($generator->current()*10);}我原本以为运行的结果会是类似这样:
