程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 輕量級“集合”迭代器-Generator,集合-generator

輕量級“集合”迭代器-Generator,集合-generator

編輯:關於PHP編程

輕量級“集合”迭代器-Generator,集合-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很簡單,看上去就像定義一個函數一樣:

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

只是,makeRangeByGenerator沒有返回值,也沒有把整個數組創建在內存裡,而只是通過關鍵字yield,標記了每次循環應該生成的值。接下來,我們可以像訪問一個普通集合一樣使用generator:

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

 

現在重新執行我們的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();

*“我們必須在所有迭代完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 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



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved