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

轻量级“集合”迭代器-Generator
泊学视频连接
泊阅文档连接
Generator是PHP 5.5加入的新语言特性。可是,它彷佛并无被不少PHP开发者普遍采用。所以,在咱们了解PHP 7对Generator的改进以前,咱们先经过一个简单却显而易见的例子来了解下Generator究竟为咱们解决什么问题。php


一千万个整数的数组

若是咱们要“建立一个指定元素个数的数组”,怎么作呢?咱们可能会不加思索的写下下面的代码:数组

function makeRange($range) {
    $data = [];

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

    return $data;
}

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

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

可是,当咱们建立一个包涵1千万个整数的数组时,状况就不同了,系统没有那么多内存分配给咱们:函数

makeRange(10000000);

bo-reading-array-oom@2x.jpg
在资源有限的状况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。spa

把PHP Generator请出来帮忙

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

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

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

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

bo-reading-generator-list@2x.jpg
如今从新执行咱们的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();

bo-reading-generator-return@2x.jpg
*“咱们必须在全部迭代完generator全部值以后,才能读取generator的返回值,不然PHP会报错。”
——最佳实践*
bo-reading-generator-reterror@2x.jpg

  • 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;
}

bo-reading-php-best@2x.jpg
这就是关于PHP generator的所有内容。简单来讲,generator就是一个轻量级的,能够记住自身状态的“集合”迭代器。若是你以前还不了解它,如今是时候考虑下它在哪些地方能够帮助到你了。

了解更多优质IT技术,拓展阅读视野,欢迎你们访问咱们的合做伙伴Segmentfault

相关文章
相关标签/搜索