PHP5.5或将引入Generators

最先的时候, 我记得是去年我刚加入开发组的时候, 神仙同窗曾经提过, 问我是否能够考虑为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语言的相关介绍.

呵呵, 你们以为这个新特性怎么样呢?

相关文章
相关标签/搜索