1.生成器类与自定义类
生成器(Generator
)类是PHP语言内置的类,与自定义类一样都实现了 Iterator
接口,提供对象迭代的实现方式。
1.1优势:性能更好
一个简单的例子就是使用生成器函数来重新实现 range()
函数。标准的 range()
函数需要在内存中生成一个数组包含每一个在它范围内的值,然后返回该数组,结果就是会产生多个很大的数组。那会使你的内存达到上限,或者会占据可观的处理时间。比如,调用 range(0, 1000000)
将导致内存占用超过 100 MB。
做为一种替代方法,我们可以实现一个 xrange()
生成器函数,只需要足够的内存来创建 Generator
类的对象并在内部跟踪对象的当前状态,这样只需要不到1K字节的内存。
1.2优势:代码量更少
生成器类与自定义类, 同样的功能,用生成器函数可以编写更少的代码,可读性也更强。
1.3劣势:只向前迭代
生成器类是一个只能向前的迭代器,意思是说,被迭代的对象只能按顺序迭代,不可以逆向迭代等其它迭代顺序。
2.生成器函数声明
生成器函数看起来像普通函数,不同的是,普通函数遇到 return
时会立即返回值并终止函数的执行,而 yield
会返回一个值给循环调用此生成器函数的代码并且只是暂停执行生成器函数,然后继续从暂停点执行直至循环结束。
任何包含 yield
的函数都是一个生成器函数。
2.1带参数的yield
function xrange($start, $limit, $step = 1)
{
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Step must be positive');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be negative');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
2.2带键值对参数的yield
yield $id => $fields;
2.3不带参数的yield
yield
可以在没有参数传入的情况下被调用来生成一个 null
值并配对一个自动的键名。
yield;
2.4yield from
生成器委托允许使用 yield from
从另外一个生成器、Traversable
对象、array
生成值。
yield from 外部生成器
2.调用生成器函数
当调用生成器函数时,会返回一个 Generator
类的对象。
//注意下面range()和xrange()输出的结果是一样的
echo 'Single digit odd numbers from range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo 'Single digit odd numbers from 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
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/20042.html