Php中的Generator如何使用?

2021-08-02 21:21:13 字數 2834 閱讀 4786

何為 generator

從 php 5.5 開始,php 加入了乙個新的特性,那就是generator,中文譯為生成器。生成器可以簡單地用來實現物件的迭代,讓我們先從官方的乙個小例子說起。

xrange

在 php 中,我們都知道,有乙個函式叫做range,用來生成乙個等差數列的陣列,然後我們可以用這個陣列進行foreach的迭代。具體就想這樣。

foreach(range(1, 100, 2) as $num) \n";

}這一段**就會輸出首項為 1,末項為 100,公差為 2 的等差數列。它的執行順序是這樣的。首先,range(1, 100, 2)會生成乙個陣列,裡面存了上面那樣的乙個等差數列,之後在foreach中對這個陣列進行迭代。

那麼,這樣就會出現乙個問題,如果我要生成 100 萬個數字呢?那我們就要占用上百兆記憶體。雖然現在記憶體很便宜,但是我們也不能這麼浪費記憶體嘛。那麼這時,我們的生成器就可以排上用場了。考慮下面的**。

function xrange($start, $limit, $step = 1)

foreach(xrange(1, 100, 2)as$num) \n";

}這段**所的出來的結果,和前面的那段**一模一樣,但是,它內部的原理是天翻地覆了。

我們剛才說了,前面的**,range會生成乙個陣列,然後foreach來迭代這個陣列,從而取出某乙個值。但是這段**呢,我們重新定義了乙個xrange函式,在函式中,我們用了乙個關鍵字yield。我們都知道定義乙個函式,希望它返回乙個值得時候,用return來返回。那麼這個yield呢,也可以返回乙個值,但是,它和return是截然不同的。

這樣,我們上面的函式呼叫可以等價地寫成這樣。

$nums = xrange(1, 100, 2);while($nums->valid())

在這裡,$num是乙個generator的物件。我們在這裡看到三個方法,validcurrentnext。當我們函式執行完了,後面沒有yield中斷了,那麼我們在xrange函式就執行完了,那麼valid方法就會變成false。而current呢,會返回當前yield後面的值,這是,生成器的函式會中斷。那麼在呼叫next方法之後,函式會繼續執行,直到下乙個yield出現,或者函式結束。

好了,到這裡,我們看到了通過yield來「生成」乙個值並返回。其實,yield其實也可以這麼寫$ret = yield;。同返回值一樣,這裡是將乙個值在繼續執行函式的時候,傳值進函式,可以通過generator::send($value)來使用。例如。

function sum()\n";

}$sum = sum();

$sum->send('i am from outside.');

這樣,程式就會列印出send方法傳進去的字串了。在yield的兩邊可以同時有呼叫。

function xrange($start, $limit, $step = 1) \n";

}而像這樣的使用,send()可以返回下乙個yield的返回。

其它的 generator 方法

generator::key()

對於yield,我們可以這樣使用yield $id => $value,這是,我們可以通過key方法來獲取$id,而current方法返回的是$value

generator::rewind()

這個方法,可以幫我們讓生成器重新開始執行並儲存上下文,同時呢,會返回第乙個yield返回的內容。在第一次執行send方法的時候,rewind會被隱式呼叫。

generator::throw()

這個方法,向生成器中,拋送乙個異常。

後記

yield作為 php 5.5 的新特性,讓我們用了新的方法來高效地迭代資料。同時,我們還可以使用yield來實現協程。

JS中的Generator 筆記

語法上,首先可以把它理解成,generator 函式是乙個狀態機,封裝了多個內部狀態。執行 generator 函式會返回乙個遍歷器物件,也就是說,generator 函式除了狀態機,還是乙個遍歷器物件生成函式。返回的遍歷器物件,可以依次遍歷 generator 函式內部的每乙個狀態。generat...

hibernate中generator屬性的意義

1 identity 用於mysql資料庫。特點 遞增 注 對於mysql資料庫使用遞增序列時需要在建表時對主鍵指定為auto increment屬性。2 sequence 用於oracle資料庫 序列名3 native 跨資料庫時使用,由底層方言產生。default.sequence為hibern...

PHP 生成器Generator理解

寄凡 風雪之隅 php手冊 生成器 generator 引用自官網 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。生成器允許你在foreach 塊中寫 來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限 劃...