實際上,這個方法可以用於在迭代之前測試生成器,因為它會執行您的函式直到第一個 yield 陳述式。例如,如果您嘗試在生成器中讀取不存在的檔案,通常只會在用戶端程式碼 foreach() 的第一次迭代中發生錯誤。有時事先檢查這一點至關重要。
看看這裡修改後的範例
https://php.dev.org.tw/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 的值,因為前面的程式碼已經執行。