PHP 生成器类

phpserver side programmingprogramming更新于 2025/7/18 11:07:17

简介

使用诸如 foreach 之类的循环结构遍历大量数据需要大量内存和相当长的处理时间。使用 生成器 可以迭代一组数据,而无需这些开销。生成器函数类似于普通函数。但是,生成器不使用函数中的 return 语句,而是使用 yield 关键字重复执行,从而提供要迭代的值。

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 ) − mix — 获取生成的值

public Generator::getReturn ( void ) : mix — 获取生成器的返回值

public Generator::key ( void ) − mix — 获取生成的值的键。

public Generator::next ( void ) − void — 恢复生成器的执行。与使用 NULL 作为参数调用 Generator::send() 效果相同。

public Generator::rewind ( void ) − void — 倒退迭代器。如果迭代已经开始,则会引发异常。

public Generator::send ( mixed $value ) : mixed — 将给定值作为当前 yield 表达式的结果发送给生成器,并恢复生成器的执行。

public Generator::throw ( Throwable $exception ) − mixed — 向生成器引发异常并恢复生成器的执行。

public Generator::valid ( void ) − bool — 检查迭代器是否已关闭

public Generator::__wakeup ( void ) − void — 由于生成器无法序列化,因此引发异常。

Generator 类实现 Iterator 接口。生成器对象无法通过 new 实例化。任何带有 yield 关键字的用户定义函数都会创建生成器类的对象。

生成器示例

由于生成器实现了 Iterator 接口,因此可以使用 for each 循环来遍历生成的值。

<?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() 方法遍历生成的值。循环条件通过 valid() 方法检查。

示例

<?php
function squaregenerator(){
   for ($i=1; $i<=5; $i++){
      yield $i*$i;
   }
}
$gen=squaregenerator();
while ( $gen->valid() ){
   echo "key: " . $gen->key(). " value: ". $gen->current() . "
";    $gen->next(); } ?>

输出

上述程序显示以下输出

key: 0 value: 1
key: 1 value: 4
key: 2 value: 9
key: 3 value: 16
key: 4 value: 25

相关文章