PHP生成器函数及yield关键字
** 生成器函数:本文介绍了PHP的生成器函数和yield关键字的作用以及用法**
生成器函数generator function
它很适合用来写迭代器iterator,可以在循环中定义一个可以计算并且返回值的函数
1 | //生成器函数 |
生成器函数和普通函数有什么不同呢?
就拿上面的例子来说,如果我们是使用了普通的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