文档章节

PHP5.5或将引入Generators

BearCatYN
 BearCatYN
发布于 2015/04/29 12:09
字数 630
阅读 41
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

最早的时候, 我记得是去年我刚加入开发组的时候, 神仙同学曾经提过, 问我是否可以考虑为PHP实现yield. 我当时做过尝试, 但是最后发现需要大改zend executor, 而当时的我还没有那么大的魄力(因为我记得当时我的第一个RFC刚刚被拒绝)认为我能说服那么多人接受这个变动, 所以后来就不了了之了.

但, 现在Nikita Popov, 完整的实现了这个RFC: Generators, 并且已经提供了一个可用的实现, 目前这个RFC在投票阶段, 投票形式也比较乐观, 所以如果不出大问题, PHP5.5将会引入这一新特性.

我就这里为大家简单介绍下, 这个新特性.

所谓Generators, 我们以下称为”生成器”, 是一种可以返回迭代器的生成器. 呵呵, 这话有点绕, 让我们看看一个代码, 在没有迭代器之前, 如果我们遍历一个动态生成的数组:

<?php
   function return_array() {
       $array = dummy(); //计算全部数组内容
       return $array;
   }
 
  foreach (return_array() as $v) {
  }

这里就有一个问题, 我们需要一次性生成全部数组内容, 并且返回, 想象一下如果数据来源非常大, 我们无法一次性读入内存.

当然, 我们可以采用一个类, 封装一个支持迭代的实现:

<?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) {
  }

相比这种实现, 生成器提供了一种更加简便的选择, 比如实现如上同样的功能:

<?php
function genrators() {
   while ($i = dummy_line()) //生成数组的一个元素
   {
          yield $i;
   }
}
 
foreach (generators() as $v) {
 
}

也就是说, 每当产生一个数组元素, 就通过yield关键字返回成一个, 并且函数执行暂停, 当返回的迭代器的next方法被调用的时候, 会恢复刚才函数的执行, 从上一次被yield暂停的位置开始继续执行, 到下一次遇到yield的时候, 再次返回.

好了, 这就是个简单的介绍, 如果大家有兴趣, 可以搜索一下其他已经实现了Generators语言的相关介绍.

呵呵, 大家觉得这个新特性怎么样呢?


本文转载自:http://www.laruence.com/2012/08/30/2738.html

BearCatYN
粉丝 26
博文 158
码字总数 11947
作品 0
朝阳
程序员
私信 提问
加载中

评论(0)

Php5.5新特性 Generators详解

在PHP5.5.0版本中,新增了生成器(Generators)特性,用于简化实现迭代器接口(Iterator)创建简单的迭代器的复杂性。 通过生成器,我们可以轻松的使用迭代一系列的数据,而不需要事先在内存中构...

mylxsw
2015/06/04
176
1
PHP5.5 将会带来哪些新特征

PHP5.4 在四个月前发布了,现在来看PHP下一个版本似乎早了点,但我还是想给大家透露一些PHP5.5 将会带哪些新特征。 注意一点 : PHP5.5 还在早期的开发阶段,所以没有人知道最终的结果是什么...

tsl0922
2012/11/27
524
1
PHP5.5 将会带来哪些新特征

PHP5.4 在四个月前发布了,现在来看PHP下一个版本似乎早了点,但我还是想给大家透露一些PHP5.5 将会带哪些新特征。 注意一点 :PHP5.5 还在早期的开发阶段,所以没有人知道最终的结果是什么样...

迷途d书童
2012/07/16
1.1W
25
NHibernate3剖析:Query篇之NHibernate.Linq自定义扩展

本节内容 系列引入 概述 Linq provider自定义扩展机制 Linq provider自定义扩展实现 结语 参考资料 系列引入 NHibernate3.0剖析系列分别从Configuration篇、Mapping篇、Query篇、Session策略...

YJingLee's Blog
2010/08/11
0
0
微擎未安装sg_Loaders加密组件SG11安装教程

现在有些资源(包括微擎作者)都会频繁采用这个新的加密方式! 在某些加密模板安装大破解微擎后,会经常跳出:图1 的故障 图中所示不管win还是liunx均是缺少安装SG11组件 ,非常简单,也无须...

koothon
2019/01/10
253
0

没有更多内容

加载失败,请刷新页面

加载更多

vue组件大小写说明

https://cn.vuejs.org/v2/style-guide/#%E6%A8%A1%E6%9D%BF%E4%B8%AD%E7%9A%84%E7%BB%84%E4%BB%B6%E5%90%8D%E5%A4%A7%E5%B0%8F%E5%86%99%E5%BC%BA%E7%83%88%E6%8E%A8%E8%8D%90......

李超明
31分钟前
29
0
uni-app集成WebSocket

摘自: https://uniapp.dcloud.io/api/request/websocket?id=connectsocket uni.connectSocket(OBJECT) 创建一个 WebSocket 连接。 在各个小程序平台运行时,网络相关的 API 在使用前需要配置...

SummerGao
35分钟前
11
0
关于Oracle子查询各大用法详解

子查询 一.概述: 子查询:一个select语句,作为另一条select语句语法的一部分。 select语句语法: select distinct * | 字段 from 表名 where 查询条件 group by 分组字段 having 分组条件 ...

煌sir
37分钟前
29
0
您能说说序列化和反序列化吗?是怎么实现的?什么场景下需要它?

序列化和反序列化是Java中最基础的知识点,也是很容易被大家遗忘的,虽然天天使用它,但并不一定都能清楚的说明白。我相信很多小伙伴们掌握的也就几句概念、关键字(Serializable)而已,如果深...

费先森
41分钟前
26
0
可以让你用到老的IntelliJ idea 破解法子

看下效果图如下: 安装的时候选择试用,然后进入idea 下载插件 插件地址 然后将jetbrains-agent.jar文件拖入到idea中 然后重启 然后选择Activation code 然后就ojbk了...

布袋和尚_爱吃鱼
今天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部