PHP 生成器与迭代器对象


引言

在内部调用生成器函数时,将返回生成器类的某个新对象。其实现了**迭代器**接口。该迭代器接口定义以下抽象方法

  • Iterator::current — 返回当前元素
  • Iterator::key — 返回当前元素的键
  • Iterator::next — 移至下一步元素
  • Iterator::rewind — 将迭代器返回到第一个元素
  • Iterator::valid — 检查当前位置是否有效

生成器将扮演“仅向前迭代器”对象的角色,并提供了可用于操作生成器状态的方法,包括向生成器发送值和返回生成器中的值。

作为迭代器的生成器

在以下示例中,生成器函数生成器对象中的文件中的行,可使用 oreach 循环进行遍历。此外还可以调用迭代器方法,例如**current() 和**next()。但是,由于生成器是仅向前迭代器,因此调用**rewind() 方法将抛出异常

示例

<?php
function filegenerator($name) {
   $fileHandle = fopen($name, 'r');
   while ($line = fgets($fileHandle)) {
      yield $line;
   }
   fclose($fileHandle);
}
$name="test.txt";
$file=filegenerator($name);
foreach ($file as $line)
echo $line;
$file->rewind();
echo $file->current();
$file->next();
echo $file->current();
?>

输出

在遍历文件行之后,将显示以下所示的致命错误

PHP User Defined Functions
PHP Function Arguments
PHP Variable Functions
PHP Internal (Built-in) Functions
PHP Anonymous functions
PHP Arrow Functions
PHP Fatal error: Uncaught Exception: Cannot rewind a generator that was already run

更新时间:2020-09-18

475 次浏览

开启您的 职业

完成课程获得认证

开始
广告