php 5.5之后引入了 generators。
与 php传统的迭代器不同,generators不仅不需要你实现繁重的迭代器接口,而且还能按需求值,提高性能,特别是在数据量大的时候。
generators 也并非灵丹妙药。除非你调用,否则它并不知道下一次迭代的值。并且整体只能迭代一次(需要重新迭代则必须重建generators)。
Example:
<?php
function myGenerator() {
yield 'value1';
yield 'value2';
yield 'value3';
}
调用该迭代器函数,php将返回一个与之关联的对象(建立了generators)。
该对象可被foreach之类的函数迭代,每次迭代 generators 将提供一个具体的值(停留在下一个 yield 之前)。
<?php
foreach (myGenerator() as $yieldedValue) {
echo $yieldedValue, PHP_EOL;
}
// This outputs:
// value1
// value2
// value3
之前迭代器的解决方案:
<?php
function makeRange($length) {
$dataset = [];
for ($i = 0; $i < $length; $i++) {
$dataset[] = $i;
}
return $dataset;
}
$customRange = makeRange(1000000);
foreach ($customRange as $i) {
echo $i, PHP_EOL;
}
generators 的解决方案:
<?php
function makeRange($length) {
for ($i = 0; $i < $length; $i++) {
yield $i;
}
}
foreach (makeRange(1000000) as $i) {
echo $i, PHP_EOL;
}