资讯专栏INFORMATION COLUMN

上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

wupengyu / 2502人阅读

摘要:轻量级集合迭代器泊学视频链接泊阅文档链接是加入的新语言特性。接下来,我们可以像访问一个普通集合一样使用现在重新执行我们的文件,就不会再报错了。简单来说,就是一个轻量级的,可以记住自身状态的集合迭代器。

轻量级“集合”迭代器-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."
"; }


现在重新执行我们的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."
"; } 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://www.ucloud.cn/yun/30273.html

相关文章

  • PHP回顾之协程

    摘要:本文先回顾生成器,然后过渡到协程编程。其作用主要体现在三个方面数据生成生产者,通过返回数据数据消费消费者,消费传来的数据实现协程。解决回调地狱的方式主要有两种和协程。重点应当关注控制权转让的时机,以及协程的运作方式。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 sess...

    Java3y 评论0 收藏0
  • 上手过渡PHP7(4)——取代fatal error的engine exceptions

    摘要:上手并过渡到取代的泊学原文链接泊学代码秀视频自从以来,的错误处理几乎就是一成不变的。在中,这个尴尬的现状,终于被彻底改变了。无论是还是传统的,只要类型不匹配约束的时候,就会导致异常。 上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的。只不过在PHP 5.0里添加了E_...

    mylxsw 评论0 收藏0
  • ES6-迭代(iterator)和生成generator)- 可迭代对象

    摘要:什么是可迭代对象可迭代对象具有属性是一个方法的返回值是一个迭代器结合以上第二点和第三点,可以得出就是一个生成器所以我们可以给出一个可迭代对象的明确定义就是一个具有属性,且其为一个生成器的对象,就是可迭代对象。 1: 什么是可迭代对象? 1: 可迭代对象具有Symbol.iterator属性 2: Symbol.iterator是一个方法 3: Symbol.iterator的返回值是一...

    xiao7cn 评论0 收藏0
  • 【重温基础】13.迭代和生成

    摘要:迭代器和生成器将迭代的概念直接带入核心语言,并提供一种机制来自定义循环的行为。本文主要会介绍中新增的迭代器和生成器。属性本身是函数,是当前数据结构默认的迭代器生成函数。 本文是 重温基础 系列文章的第十三篇。今日感受:每次自我年终总结,都会有各种情绪和收获。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1.语法和数据类型 【重温基础】2.流...

    ymyang 评论0 收藏0
  • ES6 之 Iterator&Generator

    摘要:可迭代对象就具有属性,它是一种与迭代器密切相关的对象。它通过指定的函数可以返回一个作用于附属对象的迭代器。迭代器特点每次调用方法时,返回一个数组,数组中两个元素,分别表示键和值。示例之输出输出输出之迭代器特点返回集合中存在的每一个键。 Iterator由来 不推荐Iterator方法。 Iterator 函数是一个 SpiderMonkey 专有特性,并且会在某一时刻被删除。有一点,需...

    xietao3 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<