當一個生成器被調用的時候,它返回一個能夠被遍歷的對象.當你遍歷這個對象的時候(例如經過一個foreach循環),PHP 將會在每次須要值的時候調用生成器函數,並在產生一個值以後保存生成器的狀態,這樣它就能夠在須要產生下一個值的時候恢復調用狀態。php
一旦再也不須要產生更多的值,生成器函數能夠簡單退出,而調用生成器的代碼還能夠繼續執行,就像一個數組已經被遍歷完了。git
標準的 range() 函數須要在內存中生成一個數組包含每個在它範圍內的值,而後返回該數組, 結果就是會產生多個很大的數組。 好比,調用 range(0, 1000000) 將致使內存佔用超過 100 MB。數組
下面來用PHP的生成器,代替原生range,實現range的方法。函數
function xrange($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException('Step must be +ve'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('Step must be -ve'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } }
Demo.net
echo 'Single digit odd numbers from range(): '; foreach (range(1, 9, 2) as $number) { echo "$number "; } echo "\n"; echo 'Single digit odd numbers from xrange(): '; foreach (xrange(1, 9, 2) as $number) { echo "$number "; }
關閉一個生成器的注意事項:code