PHP|生成器方法替代原生range

關於生成器

當一個生成器被調用的時候,它返回一個能夠被遍歷的對象.當你遍歷這個對象的時候(例如經過一個foreach循環),PHP 將會在每次須要值的時候調用生成器函數,並在產生一個值以後保存生成器的狀態,這樣它就能夠在須要產生下一個值的時候恢復調用狀態。php

一旦再也不須要產生更多的值,生成器函數能夠簡單退出,而調用生成器的代碼還能夠繼續執行,就像一個數組已經被遍歷完了。git

Demo

標準的 range() 函數須要在內存中生成一個數組包含每個在它範圍內的值,而後返回該數組, 結果就是會產生多個很大的數組。 好比,調用 range(0, 1000000) 將致使內存佔用超過 100 MB。數組

下面來用PHP的生成器,代替原生range,實現range的方法。函數

function xrange($start, $limit, $step = 1) {
    if ($start < $limit) {
        if ($step <= 0) {
            throw new LogicException('Step must be +ve');
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException('Step must be -ve');
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

Demo.net

echo 'Single digit odd numbers from range():  ';
foreach (range(1, 9, 2) as $number) {
    echo "$number ";
}
echo "\n";

echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}

關閉一個生成器的注意事項:code

https://wiki.php.net/rfc/generators#closing_a_generator對象

相關文章
相關標籤/搜索