PHP Generators与Iterator对象

介绍

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

  • Iterator::current —返回当前元素

  • Iterator::key —返回当前元素的键

  • Iterator::next- 移至下一个元素

  • Iterator::rewind —将Iterator倒退到第一个元素

  • Iterator::valid —检查当前位置是否有效

生成器充当仅向前的迭代器对象,并提供可调用的方法来操纵生成器的状态,包括向生成器发送值和从生成器返回值。

发电机作为中介人

在下面的示例中,生成器函数在生成器对象的文件中产生可使用oreach循环遍历的行。还可以调用诸如current()和next()之类的迭代器方法。但是,由于generator是仅向前的迭代器,因此调用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