SplFileInfo类的作用在于为文件或者目录的属性提供面向对象的访问功能,其典型应用是获取文件或者文件夹的信息。
SplFileInfo类提供了两个关键的方法以支持对它的扩展:
1. setInfoClass:这个函数默认指向SplFileInfo类,如果扩展了SplFileInfo类,应该将这个值设置为扩展类的名称。
2. setFileClass:这个函数默认执行一个SplFileObject类,如果扩展了这个类,应该设置这个值以确保扩展类正式调用SplFileInfo类的代码提供的类。
这两个方法对getFileInfo()、getPathInfo()和openFile()等方法的操作会产生影响。
DirectoryIterator迭代器和SplFileObject类都是从SplFileInfo类继承的,getFileInfo()方法提供了在迭代器中访问某个特定文件的信息的办法,还可以将一个文件对象转换为一个文件信息对象。openFile()方法将访问文件并返回一个SplFileInfo对象,这个对象可以被用来在文件中执行操作。
DirectoryIterator迭代器提供了访问某个目录内容列表的功能,它的current()方法会为目录中的当前项返回一个SplFileInfo对象。
使用SplFileInfo对象和DirectoryIterator迭代器示例:
view plaincopy to clipboardprint?
$pathName = '/path/source/iterator/';
foreach (new DirectoryIterator($pathName) as $fileInfo) {
if (!$fileInfo->isDot()) { //判断当前项是否当前文件夹或者父文件夹
echo $fileInfo . "\n"; //调用了SplFileInfo的__toString()方法
}
}
RecursiveDirectoryIterator迭代器提供了递归式迭代访问功能,以及确定某个路径是否含有子目录的方法。
使用RecursiveDirectoryIterator迭代器范例:
view plaincopy to clipboardprint?
$pathName = '/path/source/iterator/';
$iterator = new RecursiveDirectoryIterator($pathName);
$it = new RecursiveIteratorIterator($iterator);
print_r(iterator_to_array($it, false));
创建自定义文件过滤器:只需要创建从FilterIterator迭代器继承并且实现accept()方法就可以了。
查找特定类型文件的范例代码:
view plaincopy to clipboardprint?
class FileExtensionFinder extends FilterIterator
{
protected $predicate, $path;
public function __construct($path, $predicate)
{
$this->predicate = $predicate;
$this->path = $path;
$it = new RecursiveDirectoryIterator($path);
$flatIterator = new RecursiveIteratorIterator($it);
parent::__construct($flatIterator);
}
public function accept()
{
$pathInfo = pathinfo($this->current());
$extension = $pathInfo['extension'];
return ($extension == $this->predicate);
}
}
$it = new FileExtensionFinder('/path/source/iterator', 'php');
foreach ($it as $entry) {
echo $entry . "\n";
}
SplFileObject类将PHP文件中的I/O函数综合在一起如fopen()、fread()等函数,形成了一个多功能的面向对象的接口。可以使用这个类以面向对象的方法来读取和操作文件数据。
SplFileObject也是一个迭代器,并且还是可查找的,这允许通过foreach循环来使用文件的内容。
以行为单位的迭代访问代码范例:
view plaincopy to clipboardprint?
$it = new SplFileObject('example.csv');
foreach($it as $line) {
echo $line . "\n";
}
CSV解释操作代码范例:
view plaincopy to clipboardprint?
$it = new SplFileObject('example.csv');
while($array = $it->fgetcsv()) {
var_export($array);
}
结合SPL的示例代码,使用SPL的文件和目录特性,还可以实现查找文件、文件内容的搜索等功能。