轻量级“集合”迭代器-Generator
泊学视频链接
泊阅文档链接
Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题。


一千万个整数的数组

如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码:

function makeRange($range) {
$data = []; for ($i = 0; $i < $range; $i++) {
$data[] = $i;
} return $data;
}

然后,在我们的开发环境里,分别创建1万个,10万个,100万个元素的数组,一切看起来都如我们想象。

makeRange(10000);
makeRange(100000);
makeRange(1000000);

但是,当我们创建一个包涵1千万个整数的数组时,情况就不一样了,系统没有那么多内存分配给我们:

makeRange(10000000);


在资源有限的情况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。

把PHP Generator请出来帮忙

定义PHP generator很简单,看上去就像定义一个函数一样:

function makeRangeByGenerator($range) {
for ($i = 0; $i < $range; $i++) {
yield $i;
}
}

只是,makeRangeByGenerator没有返回值,也没有把整个数组创建在内存里,而只是通过关键字yield,标记了每次循环应该生成的值。接下来,我们可以像访问一个普通集合一样使用generator:

foreach ($makeRangeByGenerator(100) as $i) {
echo $i.'<br>';
}


现在重新执行我们的PHP文件,就不会再报错了。并且,我们可以在页面上,看到generator生成的值。这就是generator的典型应用场景,简单来说:Generator就是一个轻量级迭代器,它可以自动的记住每一次被调用时的状态,并返回给我们正确的值。

PHP 7做了哪些改进?

了解了generator的基本用法之后,我们就可以看一下PHP 7对它做了哪些改进了。

  • PHP 7允许我们给generator加入返回值,就像我们定义函数的返回值一样:

    function makeRangeByGenerator($range) {

       for ($i = 0; $i < $range; $i++) {
    yield $i;
    } return "Finish yielding";

    }

迭代完generator的所有元素时,我们就可以通过getReturn()方法,来读取generator的返回值:

$gen = makeRangeByGenerator(100);

foreach ($gen as $i) {
echo $i.'<br>';
} echo $gen->getReturn();


*“我们必须在所有迭代完generator所有值之后,才能读取generator的返回值,否则PHP会报错。”
——最佳实践*

  • PHP 7对generator的第二个改进就是允许嵌套。例如:

function outer() {
yield "PHP 7 ";
yield "is one of ";
yield "the best "; yield from inner();
} function inner() {
yield "programming languages in the world";
}

我们使用关键字from引入一个新的generator,当我们遍历outer generator时,我们就会发现,它自动生成了inner generator的值:

foreach(outer() as $str) {
echo $str;
}


这就是关于PHP generator的全部内容。简单来说,generator就是一个轻量级的,可以记住自身状态的“集合”迭代器。如果你之前还不了解它,现在是时候考虑下它在哪些地方可以帮助到你了。

了解更多优质IT技术,拓展阅读视野,欢迎大家访问我们的合作伙伴Segmentfault

轻量级“集合”迭代器-Generator
泊学视频链接
泊阅文档链接
Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题。


一千万个整数的数组

如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码:

function makeRange($range) {
$data = []; for ($i = 0; $i < $range; $i++) {
$data[] = $i;
} return $data;
}

然后,在我们的开发环境里,分别创建1万个,10万个,100万个元素的数组,一切看起来都如我们想象。

makeRange(10000);
makeRange(100000);
makeRange(1000000);

但是,当我们创建一个包涵1千万个整数的数组时,情况就不一样了,系统没有那么多内存分配给我们:

makeRange(10000000);


在资源有限的情况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。

把PHP Generator请出来帮忙

定义PHP generator很简单,看上去就像定义一个函数一样:

function makeRangeByGenerator($range) {
for ($i = 0; $i < $range; $i++) {
yield $i;
}
}

只是,makeRangeByGenerator没有返回值,也没有把整个数组创建在内存里,而只是通过关键字yield,标记了每次循环应该生成的值。接下来,我们可以像访问一个普通集合一样使用generator:

foreach ($makeRangeByGenerator(100) as $i) {
echo $i.'<br>';
}


现在重新执行我们的PHP文件,就不会再报错了。并且,我们可以在页面上,看到generator生成的值。这就是generator的典型应用场景,简单来说:Generator就是一个轻量级迭代器,它可以自动的记住每一次被调用时的状态,并返回给我们正确的值。

PHP 7做了哪些改进?

了解了generator的基本用法之后,我们就可以看一下PHP 7对它做了哪些改进了。

  • PHP 7允许我们给generator加入返回值,就像我们定义函数的返回值一样:

    function makeRangeByGenerator($range) {

       for ($i = 0; $i < $range; $i++) {
    yield $i;
    } return "Finish yielding";

    }

迭代完generator的所有元素时,我们就可以通过getReturn()方法,来读取generator的返回值:

$gen = makeRangeByGenerator(100);

foreach ($gen as $i) {
echo $i.'<br>';
} echo $gen->getReturn();


*“我们必须在所有迭代完generator所有值之后,才能读取generator的返回值,否则PHP会报错。”
——最佳实践*

  • PHP 7对generator的第二个改进就是允许嵌套。例如:

function outer() {
yield "PHP 7 ";
yield "is one of ";
yield "the best "; yield from inner();
} function inner() {
yield "programming languages in the world";
}

我们使用关键字from引入一个新的generator,当我们遍历outer generator时,我们就会发现,它自动生成了inner generator的值:

foreach(outer() as $str) {
echo $str;
}


这就是关于PHP generator的全部内容。简单来说,generator就是一个轻量级的,可以记住自身状态的“集合”迭代器。如果你之前还不了解它,现在是时候考虑下它在哪些地方可以帮助到你了。

了解更多优质IT技术,拓展阅读视野,欢迎大家访问我们的合作伙伴Segmentfault

 
 
原文:
https://segmentfault.com/a/1190000004307491

上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator的更多相关文章

  1. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  2. 上手并过渡到PHP7(4)——取代fatal error的engine exceptions

    上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了 ...

  3. 上手并过渡到PHP7(1)——基于Homestead的PHP7和XDdebug环境

    PHP7 up and running 泊学实操视频泊学原文链接PHP7, Xdebug and Homestead 在经历了13个RC版本之后,PHP 7终于来了.在我们上手评估PHP 7的新特性之 ...

  4. 上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么

    PHP7 up and running 泊学原文链接泊学实操视频 Uniform Variable Syntax 在PHP 7提出Uniform Variable Syntax之前,我们大多数人可能都 ...

  5. 上手并过渡到PHP7(2)——必须传递int, string, bool参数?没问题

    Type hints, Type safe 泊学实操视频 泊学原文链接PHP 7中最引人注目的新特性之一,无疑是Scalar type hints.我们可以在函数参数和返回值中使用scalar typ ...

  6. 集合迭代器快速失败行为及CopyOnWriteArrayList

    以下内容基于jdk1.7.0_79源码: 什么是集合迭代器快速失败行为 以ArrayList为例,在多线程并发情况下,如果有一个线程在修改ArrayList集合的结构(插入.移除...),而另一个线程 ...

  7. Java基础知识强化之集合框架笔记09:Collection集合迭代器使用的问题探讨

    1.Collection集合迭代器使用的问题探讨: (1)问题1:能用while循环写这个程序,我能不能用for循环呢?                  可以使用for循环替代. (2)问题2:不要 ...

  8. Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案

    1. 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. ConcurrentModi ...

  9. -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器

    集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别?                 A:长度区别                  ...

随机推荐

  1. Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  2. .NET CORE WebApi Post跨域提交

    参考博客:https://www.cnblogs.com/chongyao/p/8652743.html 搭建一个 .NET CORE 的 WebApi 想前后端分离, 于是为了简单做了个demo站点 ...

  3. python学习笔记——fork()创建多进程

    1 进程概述 引自 Python 多进程 fork()详解 1.1 进程 进程是程序的一次动态执行过程,它对应了从代码加载.执行到执行完毕的一个完整过程. 进程是系统进行资源分配和调度的一个独立单位. ...

  4. python学习笔记013——模块中的私有属性

    1 私有属性的使用方式 在python中,没有类似private之类的关键字来声明私有方法或属性.若要声明其私有属性,语法规则为: 属性前加双下划线,属性后不加(双)下划线,如将属性name私有化,则 ...

  5. OAF_OAF Framework状态分析(概念)

    20150706 Created By BaoXinjian

  6. Android手机在不同分辨率情况下字体自适应大小

    两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size ...

  7. uva 116 - Unidirectional TSP (动态规划)

    第一次做动规题目,下面均为个人理解以及个人方法,状态转移方程以及状态的定义也是依据个人理解.请过路大神不吝赐教. 状态:每一列的每个数[ i ][ j ]都是一个状态: 然后定义状态[ i ][ j ...

  8. win10 U盘安装ubuntu16.04双系统

    所需工具U盘,软件ultralISO.ubuntu16.04,自己使用的系统是win10 一.制作U盘启动盘 打开ultraISO软件 2 2  3 4 开始写入—>直到完成大概五分的样子 二. ...

  9. 在centos7中用mariadb代替了mysql数据库吗

    从最新版本的linux系统开始(如 Centos7),默认的是 Mariadb而不是mysql!(mysql被闭源厂家收购,有闭源风险) 使用系统自带的repos安装很简单: yum install ...

  10. 权限管理系统(一):权限系统与RBAC模型概述

    RBAC模型概述 RBAC即角色访问控制(Role Based Access Control) RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构 ...