当一个天生器被调用的时候,它返回一个可以被遍历的工具.当你遍历这个工具的时候(例如通过一个foreach循环),PHP 将会在每次须要值的时候调用工具的遍历方法,并在产生一个值之后保存天生器的状态,这样它就可以在须要产生下一个值的时候规复调用状态。
一旦不再须要产生更多的值,天生器可以大略退出,而调用天生器的代码还可以连续实行,就像一个数组已经被遍历完了
看了官方的阐明,还是看不懂,举个例子。

读取超大文件
PHP开拓很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。
这里天生器就可以派上用场啦。大略看个例子:读取text文件。我们创建一个text文本文档,并在个中输入几行笔墨,示范读取。
<?phpheader("content-type:text/html;charset=utf-8");function readTxt(){ # code... $handle = fopen("./test.txt", 'rb'); while (feof($handle)===false) { # code... yield fgets($handle); } fclose($handle);}foreach (readTxt() as $key => $value) { # code... echo $value.'<br />';}
利用天生器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的笔墨只有一行,大大的减小了内存的利用。
这样,纵然读取上G的文本也不用担心,完备可以像读取很小文件一样编写代码。
百万级别的访问量
yield天生器是php5.5之后涌现的,yield供应了一种更随意马虎的方法来实现大略的迭代工具,比较较定义类实现 Iterator 接口的办法,性能开销和繁芜性大大降落。
yield天生器许可你 在 foreach 代码块中写代码来迭代一组数据而不须要在内存中创建一个数组。