引用手冊:乙個生成器函式看起來像乙個普通的函式,不同的是普通函式返回乙個值,而乙個生成器可以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.才引入的功能,也許大家覺得生成器作用不是很明顯。但是,生成器功能的確非常有用。直接講概念估計你聽完還是一頭霧水,所以我們先來說...