文档章节

PHP5.5或将引入Generators

BearCatYN
 BearCatYN
发布于 2015/04/29 12:09
字数 630
阅读 15
收藏 0
点赞 0
评论 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
粉丝 27
博文 157
码字总数 11947
作品 0
朝阳
程序员
PHP 5.5 或将引入 Generators

本文来自 @雪候鸟 的博客: 最早的时候, 我记得是去年我刚加入开发组的时候, 神仙同学曾经提过, 问我是否可以考虑为PHP实现yield. 我当时做过尝试, 但是最后发现需要大改zend executor, 而当...

oschina ⋅ 2012/08/30 ⋅ 17

Php5.5新特性 Generators详解

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

mylxsw ⋅ 2015/06/04 ⋅ 1

PHP5.5 将会带来哪些新特征

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

迷途d书童 ⋅ 2012/07/16 ⋅ 25

JavaScript里的循环方法:forEach,for-in,for-of

JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: 自从JavaScript5起,我们开始可以使用内置的方法: 写法简单了许多,但也有短处:你不能中断循环(使用语句或...

鱼煎 ⋅ 2016/06/25 ⋅ 0

事件管道模型

事件管道模型 很多人知道事件驱动模式,那么事件管道(Event Pipeline)模式是什么?下面我们一起来探讨 event 的出现是设计为一个对象的状态的改变即就通知对该对象感兴趣的其他对象。 一般...

linugb118 ⋅ 2010/12/01 ⋅ 0

curl post file PHP

网上示例方式 使用结果 PHP5.5及以上版本 示例

o0无忧亦无怖 ⋅ 2016/08/12 ⋅ 0

PHPnew Cache_tpl 模板引擎 7.3.2 正式发布

PHP模板引擎, phpnew迎来更新. 1: 完美兼容PHP5.5+. 2: 模板并发写入优化更新, 防止卡住或者崩溃情况发生. 3: css, js引用增加模板语法功能, 引入流程更如人所想. 4: 增加Todo, buy等标注支持...

Tuesday ⋅ 2013/07/27 ⋅ 0

纯 CSS3 的导航菜单生成工具和教程

CSS3 的引入为web设计人员和开发人员带来了巨大的的可能性。通过3D变换,CSS3动画和先进的造型支持,可以建立一个无需 JavaScript 的导航菜单,但通过微妙的动画和样式在视觉仍然令人印象深刻。...

oschina ⋅ 2013/04/29 ⋅ 6

Ubuntu使用apt-get安装PHP指定版本

1、添加源 apt-get install python-software-properties -y add-apt-repository ppa:zanfur/php5.5 apt-get update 2、安装php5.5 apt-get install php5-gd php5-mysql mysql-server nginx ......

谢了 ⋅ 2015/06/30 ⋅ 0

有谁在用PHP5.4和PHP5.5

很多PHP程序在PHP5.4或PHP5.5跑不起来,大家谁在用这个PHP版本的? 你喜欢或认为PHP5.4和PHP5.5的最NB特性是什么?

eechen的粉丝 ⋅ 2013/09/21 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 昨天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 昨天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部