上手並過渡到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

相關文章
相關標籤/搜索