提出
PHP RFC 里描述了生成器的提出过程。考虑这样的需求
实现一个函数,用于获取文件内容,并可对文件内容进行遍历。
实现 1 - 普通函数
最普通的方式就是一次性读取文件内容,然后再进行遍历。
<?php
function getLinesFromFile($fileName) {
// 打开文件
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}
// 一次读取每一行并保存
$lines = [];
while (false !== $line = fgets($fileHandle)) {
$lines[] = $line;
}
fclose($fileHandle);
return $lines;
}
$lines = getLinesFromFile('test.txt');
foreach ($lines as $line) {
}
当使用该函数读取大文件时,就会因为内存不足而报错。
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
实现 2 自定义对象
既然一次性读取文件内容行不通,只能考虑边读取边遍历,可使用面向对象的思想来解决。
PHP 中的对象,只要实现了 Iterator
接口,就可用 foreach
来进行遍历。
Iterator extends Traversable {
// 返回当前索引游标指向的元素
abstract public current ( void ) : mixed
// 返回当前索引游标指向的键
abstract public key ( void ) : scalar
// 移动当前索引游标到下一元素
abstract public next ( void ) : void
// 重置索引游标
abstract public rewind ( void ) : void
// 判断当前索引游标指向的元素是否有效
abstract public valid ( void ) : bool
}
利用这点,可以手动实现 Iterator
接口,来实现边读取文件边进行遍历功能。
<?php
class L