** 生成器函数:本文介绍了PHP的生成器函数和yield关键字的作用以及用法**

生成器函数generator function

它很适合用来写迭代器iterator,可以在循环中定义一个可以计算并且返回值的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//生成器函数
function xrange($min, $max) {
for($i = $min; $i <= $max; $i++) {
yield $i;
}
}

foreach(xrange(1, 10) as $key => $value) {
echo $key,'=>',$value,PHP_EOL;
}

//会输出
0=>1
1=>2
...
9=>10

生成器函数和普通函数有什么不同呢?

就拿上面的例子来说,如果我们是使用了普通的range函数,那么该函数将会在内存生成整个数字数组并且返回整个数组到foreach中,然后foreach再遍历整个数组,range函数和foreach只交互一次,就如同一个快递员把一整个装有东西包裹给你,然后你自己拆开包裹并且从里面一个一个的拿出东西来,这样快递员和你只进行了一次交互/交流。
当我们使用了生成器函数时,php会跟踪该函数并且一直执行该函数直到遇到yield关键字或者到函数末尾。当遇到yield关键字时,它会马上返回当前值给foreach处理,然后马上又回到生成器函数里从遇到yield的地方开始再次继续执行,因此本例子在生成器函数里有for循环,因此生成器函数会再次执行下一次for循环并且会再次yield,直到循环条件不满足时结束循环。这就像foreach和生成器函数在大乒乓球一样,一人一次,接着有下一次。

那么我们为什么需要生成器函数呢?

生成器函数可以用在内存有限的环境中,如执行一个range(1,1000000)会导致一个Fatal错误,而同样的用生成器函数去做却可以正常工作,因为生成器函数每次执行只占很少的内存。不像是普通函数那样占据一整个很大的内存块。

生成器函数的其他用处

生成器函数的其他用处还有:用于 异步协同,关于这方面的使用,可以查阅一下两篇博文:
Co-operative PHP Multitasking
Cooperative multitasking using coroutines (in PHP!)

yield关键字在php5.5才引入

深入阅读:
http://blog.ircmaxell.com/2012/07/what-generators-can-do-for-you.html
http://stackoverflow.com/questions/17223802/what-is-the-difference-between-a-generator-and-an-array
https://en.wikipedia.org/wiki/Generator_(computer_programming)

本文参考:http://stackoverflow.com/questions/17483806/what-does-yield-mean-in-php