实际上,此方法可用于在迭代之前测试生成器,因为它会执行您的函数直到第一个 yield 语句。即,如果您尝试在生成器中读取不存在的文件,则错误通常只会在客户端代码 foreach() 的第一次迭代中发生。有时这对于提前检查至关重要。
查看此处修改后的示例
https://php.net/manual/ru/language.generators.overview.php#112985
<?php
function getLines($file) {
$f = fopen($file, 'r');
try {
while ($line = fgets($f)) {
yield $line;
}
} finally {
fclose($f);
}
}
$getLines = getLines('no_such_file.txt');
$getLines->rewind(); // 使用 ->rewind(),文件读取错误将在此处抛出,并且日志文件不会被清除
openAndClearLogFile();
foreach ($getLines as $n => $line) { // 不使用 ->rewind(),脚本将在此处终止,并且您的日志文件将被清除
writeToLogFile('reading: ' . $line . "\n");
}
closeLogFile();
?>
附注:在 ->rewind() 之后迭代生成器时,您将立即获得第一个 yield 的值,因为前面的代码已执行。