使用诸如foreach之类的循环结构遍历大量数据将需要大量内存和大量处理时间。使用生成器可以迭代一组数据而没有这些开销。生成器功能类似于普通功能。但是,生成器使用yield关键字而不是函数中的return语句来重复执行,以便它提供要迭代的值。
yield关键字是生成器机制的核心。即使其用法看起来与return类似,它也不会停止执行功能。它为迭代提供下一个值,并暂停函数的执行。
Generator implements Iterator { /* Methods */ public current ( void ) : mixed public getReturn ( void ) : mixed public key ( void ) : mixed public next ( void ) : void public rewind ( void ) : void public send ( mixed $value ) : mixed public throw ( Throwable $exception ) : mixed public valid ( void ) : bool public __wakeup ( void ) : void }
public Generator::current(void)−混合—获取产生的值
public Generator::getReturn(void):混合 —获取生成器的返回值
public Generator::key(void)−混合—获取产生值的键。
public Generator::next(void)-void —恢复生成器的执行。与以NULL作为参数调用Generator::send()的效果相同。
public Generator::rewind(void)− void —倒退迭代器。如果迭代已经开始,则将引发异常。
public Generator::send(mixed $value):mixed —根据当前收益率表达式的结果将给定值发送给Generator,并恢复Generator。
public Generator::throw(Throwable $exception)-混合—将异常抛出到生成器中并恢复生成器的执行。
public Generator::valid(void)− bool —检查迭代器是否已关闭
public Generator::__ wakeup(void)− void —抛出异常,因为不能序列化生成器。
Generator类实现Iterator接口。生成器对象不能通过new实例化。任何具有yield关键字的用户定义函数都将创建生成器类的对象。
由于生成器实现了Iterator接口,因此每个循环都可用于遍历所产生的值。
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); foreach ($gen as $val){ echo $val . " "; } ?>
输出结果
上面的程序显示以下输出
1 4 9 16 25
以下示例使用生成器类的current()和next()方法遍历产生的值。循环条件检查使用有效的方法。
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); while ( $gen->valid() ){ echo "key: " . $gen->key(). " value: ". $gen->current() . "\n"; $gen->next(); } ?>
输出结果
上面的程序显示以下输出
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25