PHP 生成器妙用 ( 日常使用 )
经过几章的学习,想必大家对 PHP 中的迭代器和生成器都比较熟悉了。本章节我们就来讲解下 PHP 生成器的一些妙用。
按需读取文件内容
我们在读取文件时,要么使用 file_get_content()
函数一次性将所有文件内容都读到内存中,但这样往往会耗费太多资源,所以,一般的选择应该是使用 fgets
按行读取。
以前的在循环中调用 fgets()
有一个非常不好之处,就是不能随意控制要读取的行数。导致我们必须在循环一开始就需要确定要读取的行数。
有了生成器,我们就可以使用 fgets() 按需读取文件,并在发生异常时正确关闭文件句柄。就像下面的代码所示
<?php function getLines($file) { $f = fopen($file, 'r'); try { while ($line = fgets($f)) { yield $line; } } finally { fclose($f); } } foreach (getLines("file.txt") as $n => $line) { if ($n > 5) break; echo $line; }
使用生成器保护循环语句,并在循环触发异常时进行一些清理工作
我们可以使用生成器保护循环语句,并在循环触发异常时进行一些清理工作,就像下面的代码所示
<?php function generator() { $complete = false; try { while (($result = some_function())) { yield $result; } $complete = true; } finally { if (!$complete) { // cleanup when loop breaks } else { // cleanup when loop completes } } // Do something only after loop completes }