生成器是另一種可迭代的物件,為了迭代一組資料,可以將資料存入乙個陣列,或者由乙個實現了iterator介面的物件來表示。但兩種方式要麼需要占用大量記憶體,要麼太過於繁瑣。而生成器則是第三種方式。
在php中,生成器實際是一種內建類,即generator類。不過使用生成器卻不是直接通過此類的建構函式來構造乙個可迭代的generator物件,而是由yield關鍵字來生成,並由乙個函式來返回此generator物件。例如:
function yd()
該函式執行結束後將返回乙個generator物件,而函式中yield執行了多少次,就可以從返回的generator物件中迭代出多少數值。不過並不是在函式執行完畢後生成器中就包含了所有資料,實際上資料是在迭代過程中生成的。如果yield沒有引數,則表示返回乙個null。
注意,返回的物件只能被迭代一次,再次迭代將會出錯,當然,每次執行函式都可以得到乙個新的生成器。
function yd($max=0)
}$a = yd(5);
foreach ($a as $d)
// 再次執行以下**將出錯
//foreach ($a as $d)
如果需要在生成器函式中控制yield的執行,可以使用無引數的return語句來結束函式,如果使用帶引數return語句,返回的值可由getreturn()方法獲取。
function yd($max=0)
}
當乙個生成器被呼叫的時候,它返回乙個可以被遍歷的物件.當你遍歷這個物件的時候(例如通過乙個foreach迴圈),php 將會在每次需要值的時候呼叫生成器函式,並在產生乙個值之後儲存生成器的狀態,這樣它就可以在需要產生下乙個值的時候恢復呼叫狀態。也就是說生成器物件中並沒有儲存全部迭代值。
function yd()
$a = yd();
foreach ($a as $v)
echo "getreturn: ".$a->getreturn();
/*0
1 2
getreturn: 3
*/
function yd($max=0)
}foreach (yd(8) as $k => $v)
/*0 => 0
1 => 2
2 => 4
3 => 6
4 => 8
*/
在下例中,迭代的變數通過引用返回並由外部修改。
function &yd($max=0)
}foreach (yd(8) as $k => &$v)
/*0 => 0
1 => 3
2 => 6
*/
function count_to_ten()
function seven_eight()
function eight()
function nine_ten()
$gen = count_to_ten();
foreach ($gen as $num)
echo "\ngetreturn: ";
echo $gen->getreturn();
注意,在本例中,通過getreturn()方法得到了返回值10,其中nine_ten()和count_to_ten()都使用了return語句,這兩個return語句缺一不可,否則將無法從getreturn()中獲取返回值。 生成器 PHP的生成器yield 原創
在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...
PHP的生成器
參考文章 php生成器是5.5.0引入的功能,生成器實際上就是簡單的迭代器。生成器會根據需求計算產出迭代的值,而標準的php迭代器經常在記憶體中執行迭代操作,這要預先計算出資料集,效能較低。如果使用特定的防護計算大量資料,可以使用生成器,即時計算並產出後續值,不占用記憶體。yield和生成器 相比較...
php的生成器
如果是做python或者其他語言的小夥伴,對於生成器應該不陌生。但很多php開發者或許都不知道生成器這個功能,可能是因為生成器是php 5.5.0才引入的功能,也可以是生成器作用不是很明顯。但是,生成器功能的確非常有用。直接講概念估計你聽完還是一頭霧水,所以我們先來說說優點,也許能勾起你的興趣。那麼...