使用了SPL的 迭代器, 可以直接对打开的文件进行foreach读取, 类的构造如下
class fileIterator implements Iterator
{
private $fp;
private $line_num;
private $line; public function __construct($filename)
{
$fp = @fopen($filename, 'r');
if (!$fp) {
throw new Exception("file ".$filename." is not exists");
}
$this->fp = $fp;
} public function key()
{
return $this->line_num;
} public function current()
{
return $this->line;
} public function rewind()
{
rewind($this->fp);
} public function next()
{
} public function valid()
{
$this->line = fgets($this->fp);
if ($this->line !==false) {
$this->line_num++;
return true;
}
return false;
}
}
使用方法
foreach(new fileIterator('./test.txt') as $k => $line) {
echo $k."->".$line;
}
可以再包装一个方法在对象的构造上,这样就不用显式的去构造类了。
顺带记录一下迭代器的执行顺序
迭代开始(第一次) : rewind valid current key
之后每次遍历一次运行(第二次及以后) : next 、 valid、 current、 key
如果循环的时候没有指定 key (=> value) key()函数将不会执行