做者: Laruence(
)php
最先的时候, 我记得是去年我刚加入开发组的时候, 神仙同窗曾经提过, 问我是否能够考虑为PHP实现yield. 我当时作过尝试, 可是最后发现须要大改zend executor, 而当时的我尚未那么大的魄力(由于我记得当时个人第一个RFC刚刚被拒绝)认为我能说服那么多人接受这个变更, 因此后来就不了了之了.git
但, 如今Nikita Popov, 完整的实现了这个RFC: Generators, 而且已经提供了一个可用的实现, 目前这个RFC在投票阶段, 投票形式也比较乐观, 因此若是不出大问题, PHP5.5将会引入这一新特性.github
我就这里为你们简单介绍下, 这个新特性.数组
所谓Generators, 咱们如下称为”生成器”, 是一种能够返回迭代器的生成器. 呵呵, 这话有点绕, 让咱们看看一个代码, 在没有迭代器以前, 若是咱们遍历一个动态生成的数组:函数
<?php function return_array() { $array = dummy(); //计算所有数组内容 return $array; } foreach (return_array() as $v) { }
这里就有一个问题, 咱们须要一次性生成所有数组内容, 而且返回, 想象一下若是数据来源很是大, 咱们没法一次性读入内存.google
固然, 咱们能够采用一个类, 封装一个支持迭代的实现:url
<?php class dummy implements Iterator { public function rewind() { //实现代码 } public function valid() { //实现代码 } public function current() { //实现代码 } public function key() { //实现代码 } public function next() { //实现代码 } } foreach (new Dummy() as $v) { }
相比这种实现, 生成器提供了一种更加简便的选择, 好比实现如上一样的功能:spa
<?php function genrators() { while ($i = dummy_line()) //生成数组的一个元素 { yield $i; } } foreach (generators() as $v) { }
也就是说, 每当产生一个数组元素, 就经过yield关键字返回成一个, 而且函数执行暂停, 当返回的迭代器的next方法被调用的时候, 会恢复刚才函数的执行, 从上一次被yield暂停的位置开始继续执行, 到下一次遇到yield的时候, 再次返回..net
好了, 这就是个简单的介绍, 若是你们有兴趣, 能够搜索一下其余已经实现了Generators语言的相关介绍.
呵呵, 你们以为这个新特性怎么样呢?