官方文件
生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator
介面的方式,效能開銷和複雜性大大降低。
生成器允許你在foreach
**塊中寫**來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫乙個生成器函式,就像乙個普通的自定義函式一樣,和普通函式只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。
注意:php version 5.5+
generator實現了iterator介面
generator implements iterator
生成器函式的核心是yield關鍵字。它最簡單的呼叫形式看起來像乙個return申明,不同之處在於普通return會返回值並終止函式的執行,而yield會返回乙個值給迴圈呼叫此生成器的**並且只是暫停執行生成器函式。下面是乙個簡單例子:note:
乙個生成器不可以返回值:這樣做會產生乙個編譯錯誤。然而return空是乙個有效的語法並且它將會終止生成器繼續執行。
呼叫xrang()的時候,裡面的**並沒有真正的執行,而是返回了乙個生成器物件function
xrange
($start, $end, $step = 1)
}$xrang = xrange(1, 3);
print_r($xrang); //generator object( )
var_dump($xrang
instanceof iterator); // bool(true)
//依次輸出1 2 3
foreach ($xrang
as$value)
$xrang = generator object( )
,$xrang instanceof iterator
說明generator實現了iterator介面,可以用foreach進行遍歷,每次遍歷都會隱式呼叫current()、next()、key()、valid()
等方法。
第一次呼叫generator的時候,會隱式呼叫rewind(),如果已經開始迭代了,則會丟擲異常cannot rewind a generator that was already run
,
yield 只能在函式中使用,否則會報php fatal error:the "yield" expression can only be used inside a function
,凡是使用了yield關鍵字的函式都會返回乙個generator物件。
每次**執行到yield語句都會中止執行,返回yield語句中表示式的值給generator物件,繼續迭代generator物件時,yield後面的**會接著執行,直到所有yield語句全部執行完畢或者有return語句,這個renturn語句只能返回nullreturn;
,否則會編譯錯誤。
向生成器中傳入乙個值,並且當做yield表示式的結果,然後繼續執行生成器。如果當這個方法被呼叫時,生成器不在 yield 表示式,那麼在傳入值之前,它會先執行到第乙個 yield 表示式。
第一次輸出 111 說明**執行到第乙個yield,並返回值111,此時函式的執行被中止;function
test
()$gen = test();
echo
"第一次輸出:\n";
var_dump($gen->current());
echo
"第二次輸出:\n";
var_dump($gen->send(333));
echo
"第三次輸出:\n";
var_dump($gen->next());
/** 輸出結果
第一次輸出:
int(111)
第二次輸出:
string(14) "test()->$a:333"
int(222)
第三次輸出:
string(11) "test()->$b:"
null
*/
呼叫$gen->send(333)
時,第二次輸出test()->$a:333 和 222
,說明把333傳送給了當前yield表示式,也就是第乙個出現yield的位置,把值賦給了變數$a,並輸出了變數$a,之後又輸出了222,說明generator物件$gen的迭代恢復執行,執行到下乙個yield表示式yield 222
,實際就是呼叫了next(),返回值222,當前的yield表示式迭代到第二個yield位置;
第三次輸出test()->$b: 和 null
,此時迭代器恢復執行,表示式(yield 222)
沒有收到任何引數值,所以$b為null。
PHP 生成器Generator理解
寄凡 風雪之隅 php手冊 生成器 generator 引用自官網 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。生成器允許你在foreach 塊中寫 來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限 劃...
Generator生成器基礎
生成器函式是es6提供的一種非同步程式設計解決方案,語法行為與傳統函式完全不同 function gen let iterator gen console.log iterator 不會輸出hello 是乙個迭代器物件 需要呼叫next方法才會輸出 iterator.next 輸出結果 yield相...
Php中的Generator如何使用?
何為 generator 從 php 5.5 開始,php 加入了乙個新的特性,那就是generator,中文譯為生成器。生成器可以簡單地用來實現物件的迭代,讓我們先從官方的乙個小例子說起。xrange 在 php 中,我們都知道,有乙個函式叫做range,用來生成乙個等差數列的陣列,然後我們可以用...