Skip to content

Latest commit

 

History

History
63 lines (51 loc) · 1.42 KB

3.Generators.md

File metadata and controls

63 lines (51 loc) · 1.42 KB

php 5.5之后引入了 generators。

与 php传统的迭代器不同,generators不仅不需要你实现繁重的迭代器接口,而且还能按需求值,提高性能,特别是在数据量大的时候。

generators 也并非灵丹妙药。除非你调用,否则它并不知道下一次迭代的值。并且整体只能迭代一次(需要重新迭代则必须重建generators)。

Example:

<?php
function myGenerator() {
    yield 'value1'; 
    yield 'value2'; 
    yield 'value3';
}

调用该迭代器函数,php将返回一个与之关联的对象(建立了generators)。

该对象可被foreach之类的函数迭代,每次迭代 generators 将提供一个具体的值(停留在下一个 yield 之前)。

<?php
foreach (myGenerator() as $yieldedValue) {
    echo $yieldedValue, PHP_EOL; 
}

// This outputs:
//    value1
//    value2
//    value3

之前迭代器的解决方案:

<?php
function makeRange($length) {
    $dataset = [];
    for ($i = 0; $i < $length; $i++) {
        $dataset[] = $i;
    }
    return $dataset; 
}
$customRange = makeRange(1000000); 
foreach ($customRange as $i) {
    echo $i, PHP_EOL; 
}

generators 的解决方案:

<?php
function makeRange($length) {
    for ($i = 0; $i < $length; $i++) { 
        yield $i;
    } 
}
foreach (makeRange(1000000) as $i) { 
    echo $i, PHP_EOL;
}