PHP 5.5 或将引入 Generators

jopen 9年前
   <p>最早的时候, 我记得是去年我刚加入开发组的时候, 神仙同学曾经提过, 问我是否可以考虑为PHP实现yield. 我当时做过尝试, 但是最后发现需要大改zend executor, 而当时的我还没有那么大的魄力(因为我记得当时我的第一个RFC刚刚被拒绝)认为我能说服那么多人接受这个变动, 所以后来就不了了之了.</p>    <p>但, 现在Nikita Popov, 完整的实现了这个<a href="/misc/goto?guid=4958348452441530651">RFC: Generators</a>, 并且已经提供了一个可用的<a href="/misc/goto?guid=4958523162053679439">实现</a>, 目前这个RFC在投票阶段, 投票形式也比较乐观, 所以如果不出大问题, PHP5.5将会引入这一新特性.</p>    <p>我就这里为大家简单介绍下, 这个新特性.</p>    <p>所谓Generators, 我们以下称为”生成器”, 是一种可以返回迭代器的生成器. 呵呵, 这话有点绕, 让我们看看一个代码, 在没有迭代器之前, 如果我们遍历一个动态生成的数组:</p>    <pre class="sh_php sh_sourceCode">    <?php         function return_array() {             $array = dummy(); //计算全部数组内容             return $array;         }               foreach (return_array() as $v) {        }</pre>    <p>这里就有一个问题, 我们需要一次性生成全部数组内容, 并且返回, 想象一下如果数据来源非常大, 我们无法一次性读入内存.</p>    <p>当然, 我们可以采用一个类, 封装一个支持迭代的实现:</p>    <pre class="sh_php sh_sourceCode">    <?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) {        }</pre>    <p>相比这种实现, 生成器提供了一种更加简便的选择, 比如实现如上同样的功能:</p>    <pre class="sh_php sh_sourceCode">    <?php      function genrators() {         while ($i = dummy_line()) //生成数组的一个元素         {                yield $i;         }      }             foreach (generators() as $v) {             }</pre>    <p>也就是说, 每当产生一个数组元素, 就通过yield关键字返回成一个, 并且函数执行暂停, 当返回的迭代器的next方法被调用的时候, 会恢复刚才函数的执行, 从上一次被yield暂停的位置开始继续执行, 到下一次遇到yield的时候, 再次返回.</p>    <p>好了, 这就是个简单的介绍, 如果大家有兴趣, 可以搜索一下其他已经实现了Generators语言的相关介绍.</p>    <p>呵呵, 大家觉得这个新特性怎么样呢?<br /> <br /> 本文来自 <span class="user">雪候鸟 的<a href="/misc/goto?guid=4958523162185075111" target="_blank">博客</a>:</span></p>