php生成器yield
迭代生成器(迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回,而不是只返回一个单独的值.或者,换句话说,生成器使你能更方便的实现了迭代器接口.下面通过实现一个xrange函数来简单说明: <?php function xrange($start,$end,$step = 1) { for ($i = $start; $i <= $end; $i += $step) { yield $i; // yield关键字类似return关键字的作用,都是在函数中返回一个值,而return是返回后执行析构函数,终止函数,yield是返回一个值,中断函数,并记住当前位置 } } foreach (xrange(1,1000000) as $num) { echo $num,"n"; } 上面这个xrange()函数提供了和PHP的内建函数range()一样的功能.但是不同的是range()函数返回的是一个包含值从1到100万的数组(注:请查看手册). 而xrange()函数返回的是依次输出这些值的一个迭代器,而不会真正以数组形式返回. 这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中.甚至你可以处理无限大的数据流. 当然,也可以不同通过生成器来实现这个功能,而是可以通过继承Iterator接口实现.但通过使用生成器实现起来会更方便,不用再去实现iterator接口中的5个方法了. 生成器为可中断的函数生成器是一种可中断的函数,在它里面的yield构成了中断点. 还是看上面的例子,调用xrange(1,1000000)的时候,xrange()函数里代码其实并没有真正地运行. 它只是返回了一个迭代器: <?php $range = xrange(1,1000000); var_dump($range); // object(Generator)#1 var_dump($range instanceof Iterator); // bool(true) ?> 这也解释了为什么xrange叫做迭代生成器,因为它返回一个迭代器,而这个迭代器实现了Iterator接口. 调用迭代器的方法一次,其中的代码运行一次.例如,如果你调用(range->rewind(),那么xrange()里的代码就会运行到控制流第一次出现yield的地方. 而函数内传递给yield语句的返回值可以通过)range->current()获取. 为了继续执行生成器中yield后的代码,你就需要调用$range->next()方法. 这将再次启动生成器,直到下一次yield语句出现. 因此,连续调用next()和current()方法,你就能从生成器里获得所有的值,直到再没有yield语句出现. 对xrange()来说,这种情形出现在(i超过)end时. 在这中情况下,控制流将到达函数的终点,因此将不执行任何代码.一旦这种情况发生,vaild()方法将返回假,这时迭代结束.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |