PHP Generator类

介绍

使用诸如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