注意:PHP5.5以上版本才支援生成器。
產生器提供了一種更容易的方法來實現簡單的物件迭代,但沒有實作一個具有 Iterator 介面的類別所帶來的效能開銷和複雜性。
生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數據而不需要在內存中創建一個數組, 那會使你的內存達到上限,或者會佔據可觀的處理時間。相反,你可以寫一個生成器函數,就像一個普通的自定義函數一樣, 和普通函數只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。
一個簡單的例子就是使用生成器來重新實作 range() 函數。 標準的 range() 函數需要為其中的每一個回傳值在記憶體中產生一個陣列, 結果就是產生一個很大的陣列。 例如,呼叫 range(0, 1000000) 將導致記憶體佔用超過 100 MB。
做為一種替代方法, 我們可以實現一個 xrange() 生成器, 只需要足夠的內存來創建 Iterator 對象並在內部跟踪生成器的當前狀態,這樣只需要不到1K字節的內存。
Example #1 將 range() 實作為生成器
<?php function xrange($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException('step必须是正数'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('step必须是负数'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } } /* 注意range() 和 xrange() 的结果在下面的统一输出中. */ echo '来自range()的单个奇数: '; foreach (range(1, 9, 2) as $number) { echo "$number "; } echo "\n"; echo '来自xrange()的单个奇数 '; foreach (xrange(1, 9, 2) as $number) { echo "$number "; } ?>
以上程式會輸出:
Single digit odd numbers from range(): 1 3 5 7 9 Single digit odd numbers from xrange(): 1 3 5 7 9