这篇文章主要介绍了PHP中的发电机是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。
何为发电机
从PHP 5.5开始,PHP加入了一个新的特性,那就是<代码>发电机> 代码,中文译为<代码>生成器> 代码。生成器可以简单地用来实现对象的迭代,让我们先从官方的一个小例子说起。
xrange
在PHP中,我们都知道,有一个函数叫做<代码> 代码>,用来生成一个等差数列的数组,然后我们可以用这个数组进行<代码> foreach> 代码的迭代。具体就想这样。
foreach (范围(1,100,2),as num美元),{ ,,,echo num 美元;只PHP_EOL; }
这一段代码就会输出首项为1,末项为100公差为2的等差数列。它的执行顺序是这样的。首先,<代码>范围(100 2)代码>会生成一个数组,里面存了上面那样的一个等差数列,之后在<代码> foreach> 代码中对这个数组进行迭代。
那么,这样就会出现一个问题,如果我要生成100多万个数字呢?那我们就要占用上百兆内存。虽然现在内存很便宜,但是我们也不能这么浪费内存嘛。那么这时,我们的生成器就可以排上用场了。考虑下面的代码。
function xrange()美元开始,限制美元,美元step =, 1), { ,,,while (start 美元;& lt;=,限制美元),{ ,,,,,,,油品收率开始美元; ,,,,,,,start 美元;+=,一步美元; ,,,} } foreach (xrange(100年,1,,2),as num美元),{ ,,,echo num 美元;只PHP_EOL; }
这段代码所的出来的结果,和前面的那段代码一模一样,但是,它内部的原理是天翻地覆了。
我们刚才说了,前面的代码,<代码> 代码>范围会生成一个数组,然后<代码> foreach> 代码来迭代这个数组,从而取出某一个值。但是这段代码呢,我们重新定义了一个<代码> xrange 代码>函数,在函数中,我们用了一个关键字<代码> 代码>。我们都知道定义一个函数,希望它返回一个值得时候,用<代码> 代码>返回来返回。那么这个<代码> 代码>呢,也可以返回一个值,但是,它和<代码> 代码>返回是截然不同的。
使用<代码> 代码>收益率关键字,可以让函数在运行的时候,中断,同时会保存整个函数的上下文,返回一个<代码>发电机> 代码类型的对象。在执行对象的<代码>下> 代码方法时,会重新加载中断时的上下文,继续运行,直到出现下一个<代码> 代码>收益率为止,如果后面没有再出现<代码>产量> 代码,那么就认为整个生成器结束了。
这样,我们上面的函数调用可以等价地写成这样。
nums 美元;=,xrange(100年,1,,2); while (num→美元有效()),{ ,,,echo num→美元当前的(),只“\ n"; ,,,num→美元next (); }
在这里,num美元<代码> 代码>是一个<代码>发电机> 代码的对象。我们在这里看到三个方法,<代码>有效的代码>,<代码>当前代码>和<代码> 代码>。当我们函数执行完了,后面没有<代码> 代码>中收益率断了,那么我们在<代码> xrange 代码>函数就执行完了,那么<代码> 代码>有效方法就会变成<代码>假> 代码。而目前<代码> 代码>呢,会返回当前<代码> 代码>后收益率面的值,这是,生成器的函数会中断。那么在调用下代码> <代码>方法之后,函数会继续执行,直到下一个<代码>产量> 代码出现,或者函数结束。
好了,到这里,我们看到了通过<代码>产量> 代码来“生”成一个值并返回。其实,<代码> 代码>其收益率实也可以这么写<代码>美元ret=产量;> 代码。同返回值一样,这里是将一个值在继续执行函数的时候,传值进函数,可以通过<代码>发电机::发送(美元值)代码>来使用,例如。
function 和() { ,,,ret 美元;=,收益率; ,,,echo ret 美元;只PHP_EOL; } $ sum =, sum (); 美元金额→发送(& # 39;小姐:am 得到外面强生# 39;);
这样,程序就会打印出<代码> 代码>发送方法传进去的字符串了。在<代码> 代码>的收益率两边可以同时有调用。
function xrange(开始,美元,美元限制,,step 美元;=,1),{ ,,,while (start 美元;& lt;=,限制美元),{ ,,,,,,,ret 美元;=,油品收率开始美元; ,,,,,,,start 美元;+=,一步美元; ,,,,,,,echo ret 美元;只PHP_EOL; ,,,} } nums 美元;=,xrange(1), 100年,2); while (num→美元有效()),{ ,,,echo num→美元当前的(),只“\ n"; ,,,num→美元发送(num→美元当前的(),+,1); }PHP中的发电机是什么