php的Generator生成器及yield

2021-07-26 02:30:55 字數 2518 閱讀 8009

官方文件

生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。

生成器允許你在foreach**塊中寫**來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫乙個生成器函式,就像乙個普通的自定義函式一樣,和普通函式只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。

注意:php version 5.5+

generator實現了iterator介面

generator implements iterator
生成器函式的核心是yield關鍵字。它最簡單的呼叫形式看起來像乙個return申明,不同之處在於普通return會返回值並終止函式的執行,而yield會返回乙個值給迴圈呼叫此生成器的**並且只是暫停執行生成器函式。

note:

乙個生成器不可以返回值:這樣做會產生乙個編譯錯誤。然而return空是乙個有效的語法並且它將會終止生成器繼續執行。

下面是乙個簡單例子:

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()的時候,裡面的**並沒有真正的執行,而是返回了乙個生成器物件$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 表示式。

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

*/

第一次輸出 111 說明**執行到第乙個yield,並返回值111,此時函式的執行被中止;

呼叫$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,用來生成乙個等差數列的陣列,然後我們可以用...