php之生成器

2021-07-27 13:30:25 字數 2130 閱讀 6895

引用手冊:乙個生成器函式看起來像乙個普通的函式,不同的是普通函式返回乙個值,而乙個生成器可以yield生成許多它所需要的值。當乙個生成器被呼叫的時候,它返回乙個可以被遍歷的物件.當你遍歷這個物件的時候(例如通過乙個foreach迴圈),php 將會在每次需要值的時候呼叫生成器函式,並在產生乙個值之後儲存生成器的狀態,這樣它就可以在需要產生下乙個值的時候恢復呼叫狀態。

以下這句話會讓讓上面手冊的內容更加的理解明白。

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

為什麼要用生成器?手冊上說道,乙個簡單的例子就是使用生成器來實現range函式;因為如果使用range函式生成乙個很大的陣列的時候,那麼占用記憶體是非常大的,所以使用生成器可以很好的解決這個問題。

注:請使用5.4以上版本

我在這裡使用手冊裡面的例子來說明一下使用生成器實現range函式;在這裡我把手冊的演示刪除了一點**,這樣就可以專注來說生成器了:

先看乙個最簡單的例子:

<?php 

//定乙個函式

function

gen_one_to_three

() }

//yield會返回乙個值給迴圈呼叫此生成器的**並且只是暫停執行生成器函式。

$generator = gen_one_to_three();

foreach ($generator

as$value)

?>

隨後輸出了 1 2 3

我們再看以下xrange實現(我刪掉了一些**):

<?php 

//定義xrange函式

function

xrange

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

} else

}}/*

* 注意下面range()和xrange()輸出的結果是一樣的。

*/echo

'single digit odd numbers from range(): ';

//在這裡使用range函式

foreach (range(1, 9, 2) as

$number)

echo"";

echo

'single digit odd numbers from xrange(): ';

//在這裡我們使用自定義的xrange

//注意:yield會返回乙個值給迴圈呼叫此生成器的**並且只是暫停執行生成器函式。

//所以她們的輸出是相同的

foreach (xrange(1, 9, 2) as

$number)

?>

輸出如下如下:

生成乙個鍵值對:這裡使用的也是php手冊裡面的例子,在這裡我把解釋寫在了**的注釋中了

<?php 

/* * 下面每一行是用分號分割的字段組合,第乙個欄位將被用作鍵名。

*///input變數

$input = <<

1;php;likes dollar signs

2;python;likes whitespace

3;ruby;likes blocks

eof;

//定義方法 引數為input

function

input_parser

($input)

}//呼叫input_parser函式,傳入input

foreach (input_parser($input) as

$id => $fields)

?>

執行如下:

身體不適。。。運動過度。。。今天就一篇吧。。。

生成器 PHP的生成器yield 原創

在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...

PHP的生成器

參考文章 php生成器是5.5.0引入的功能,生成器實際上就是簡單的迭代器。生成器會根據需求計算產出迭代的值,而標準的php迭代器經常在記憶體中執行迭代操作,這要預先計算出資料集,效能較低。如果使用特定的防護計算大量資料,可以使用生成器,即時計算並產出後續值,不占用記憶體。yield和生成器 相比較...

PHP生成器細說

之前寫過關於生成器的文章,可能還不夠詳細,正好群裡有朋友在討論。覺得還是有必要再細說下,如果大家做過python或者其他語言的,對於生成器應該不陌生。生成器是php 5.5.才引入的功能,也許大家覺得生成器作用不是很明顯。但是,生成器功能的確非常有用。直接講概念估計你聽完還是一頭霧水,所以我們先來說...