輕量級「集合」迭代器-Generator
泊學視頻連接
泊閱文檔連接
Generator是PHP 5.5加入的新語言特性。可是,它彷佛並無被不少PHP開發者普遍採用。所以,在咱們瞭解PHP 7對Generator的改進以前,咱們先經過一個簡單卻顯而易見的例子來了解下Generator究竟爲咱們解決什麼問題。php
若是咱們要「建立一個指定元素個數的數組」,怎麼作呢?咱們可能會不加思索的寫下下面的代碼:數組
function makeRange($range) { $data = []; for ($i = 0; $i < $range; $i++) { $data[] = $i; } return $data; }
而後,在咱們的開發環境裏,分別建立1萬個,10萬個,100萬個元素的數組,一切看起來都如咱們想象。php7
makeRange(10000); makeRange(100000); makeRange(1000000);
可是,當咱們建立一個包涵1千萬個整數的數組時,狀況就不同了,系統沒有那麼多內存分配給咱們:函數
makeRange(10000000);
在資源有限的狀況下,解決大文件或大批量數據的處理問題,就是PHP generator的一個典型應用。spa
定義PHP generator很簡單,看上去就像定義一個函數同樣:code
function makeRangeByGenerator($range) { for ($i = 0; $i < $range; $i++) { yield $i; } }
只是,makeRangeByGenerator沒有返回值,也沒有把整個數組建立在內存裏,而只是經過關鍵字yield,標記了每次循環應該生成的值。接下來,咱們能夠像訪問一個普通集合同樣使用generator:視頻
foreach ($makeRangeByGenerator(100) as $i) { echo $i.'<br>'; }
如今從新執行咱們的PHP文件,就不會再報錯了。而且,咱們能夠在頁面上,看到generator生成的值。這就是generator的典型應用場景,簡單來講:Generator就是一個輕量級迭代器,它能夠自動的記住每一次被調用時的狀態,並返回給咱們正確的值。內存
瞭解了generator的基本用法以後,咱們就能夠看一下PHP 7對它作了哪些改進了。資源
PHP 7容許咱們給generator加入返回值,就像咱們定義函數的返回值同樣:開發
function makeRangeByGenerator($range) {
for ($i = 0; $i < $range; $i++) { yield $i; } return "Finish yielding";
}
迭代完generator的全部元素時,咱們就能夠經過getReturn()方法,來讀取generator的返回值:
$gen = makeRangeByGenerator(100); foreach ($gen as $i) { echo $i.'<br>'; } echo $gen->getReturn();
*「咱們必須在全部迭代完generator全部值以後,才能讀取generator的返回值,不然PHP會報錯。」
——最佳實踐*
PHP 7對generator的第二個改進就是容許嵌套。例如:
function outer() { yield "PHP 7 "; yield "is one of "; yield "the best "; yield from inner(); } function inner() { yield "programming languages in the world"; }
咱們使用關鍵字from引入一個新的generator,當咱們遍歷outer generator時,咱們就會發現,它自動生成了inner generator的值:
foreach(outer() as $str) { echo $str; }
這就是關於PHP generator的所有內容。簡單來講,generator就是一個輕量級的,能夠記住自身狀態的「集合」迭代器。若是你以前還不瞭解它,如今是時候考慮下它在哪些地方能夠幫助到你了。
瞭解更多優質IT技術,拓展閱讀視野,歡迎你們訪問咱們的合做夥伴Segmentfault