时间:2022-6-23来源:本站原创作者:佚名
PHP的SPL扩展库(五)文件及设计模式

对于SPL来说,除了我们之前学习到的各种数据结构以及迭代器之外,还有一类非常好用的功能就是对于文件的操作。今天我们就来学习这方面的内容,同时,这也是SPL系列文章中最后要学习的内容。

文件操作

对于PHP的文件操作来说,在默认情况下我们都是使用面向过程的那些函数来进行操作,比如fopen()、fwrite()、fread()、fgets()这些。而SPL中提供的则是以面向对象的方式来进行这些文件相关的操作。

文件信息类

首先我们要学习的是SplFileInfo这个类。

$file=newSplFileInfo(./6.PHP的SPL扩展库(四)函数.php);

实例化它的时候,就需要传递一个文件路径参数。比如这里我们就直接打开上一篇文章的测试代码。然后,我们的$file变量就会得到一个SplFileInfo对象,在这个对象中,有许多和文件函数类似的方法可以供我们使用。

var_dump($file-getBasename());//string(39)"6.PHP的SPL扩展库(四)函数.php"var_dump($file-getPathname());//string(41)"./6.PHP的SPL扩展库(四)函数.php"var_dump($file-getFilename());//string(39)"6.PHP的SPL扩展库(四)函数.php"var_dump($file-getRealPath());//string()"/Users/zhangyue/MyDoc/博客文章/dev-blog/php//01/source/6.PHP的SPL扩展库(四)函数.php"var_dump($file-getPathInfo());//object(SplFileInfo)#2(2){//["pathName":"SplFileInfo":private]=//string(1)"."//["fileName":"SplFileInfo":private]=//string(1)"."//}var_dump($file-getFileInfo());//object(SplFileInfo)#2(2){//["pathName":"SplFileInfo":private]=//string(41)"./6.PHP的SPL扩展库(四)函数.php"//["fileName":"SplFileInfo":private]=//string(39)"6.PHP的SPL扩展库(四)函数.php"//}

我们可以通过上面的这些测试代码来获得文件相关的一些路径信息。是不是和普通的那些文件操作函数非常类似,或者说是完全一样的命名和使用方式。

var_dump($file-getExtension());//string(3)"php"var_dump($file-getType());//string(4)"file"var_dump($file-getCTime());//int()var_dump($file-getOwner());//int()var_dump($file-getGroup());//int(20)var_dump($file-getSize());//int()

当然,文件的这些属性信息也都是可以正常获取到的,比如文件的扩展名、类型、各种文件相关的时间、拥有者、属组、大小之类的信息。

var_dump($file-isReadable());//bool(true)var_dump($file-isWritable());//bool(true)var_dump($file-isDir());//bool(false)var_dump($file-isFile());//bool(true)var_dump($file-isLink());//bool(false)

当然,判断文件是否可写、可读,是否是目录或文件或连接的方法都有。总体来说,普通的文件操作函数所拥有的功能这边都是存在的,在这里我们也只是列出了一部分,更多的方法大家可以在官方文件中查阅。

文件操作类

上面的SplFileInfo中,我们好像没有对文件进行读写操作之类的功能,只能看到文件的一些属性信息。别急,对于文件的其它操作,我们使用另外一个类SplFileObject。它是继承自SplFileInfo的,并且另外又多实现了两个迭代器的接口。关于这两个多实现的接口的功能我们在后面会讲到。而相对于SplFileInfo来说,它扩展了文件的一些读写方法,能够让我们方便地进行文件的各种读写操作。

$txt1=newSplFileObject(7.1.txt,a+);$txt1-fwrite(date(Y-m-dH:i:s.PHP_EOL));//71.txt//-01-:03:15//……//……

在实例化的时候,我们就可以通过SplFileObject的第二个参数来指定文件打开的形式,这个参数和fopen()函数中的相关参数的作用是一样的。这里我们使用的是a+,也就是追加读写的能力。因为我们要不断地测试,所以使用的就是这样的一个读写属性。在实例化之后,我们使用对象的fwrite()方法就可以正常的向文件中进行写入了。

$txt1-seek(0);var_dump($txt1-fread($txt1-getSize()));//string(80)"-01-:03:15//"

对于读取来说,我们要先将文件对象内部的句柄指针指回开头处。这里使用的seek()方法是不是很眼熟。没错,它的出现正是SplFileObject实现了Seekable接口的最好证明。接着,我们使用fread()就可以读取文件中的全部内容了。

当然,像是在普通的文件函数中最经典的eof+fgets这种遍历方式在SplFileObject中也是支持的,同样,它也支持fgetc、fgetss这些方法。

$txt1-seek(0);while(!$txt1-eof()){var_dump($txt1-fgets());}//string(20)"-01-:03:15//"//string(20)"-01-:03:16//"//……//……

前面说过,SplFileObject是继承了一些迭代器接口的,也就是说,我们可以直接遍历这个对象来获得文件里面的内容。

foreach($txt1as$t){var_dump($t);}//string(20)"-01-:03:15//"//string(20)"-01-:03:16//"//……//……

是不是很神奇?这确实是SplFileObject中非常神奇的一个地方。通过这种方式我们直接就可以通过foreach()来实现对文件内容的遍历,而且可以看出,这种遍历形式也是按行来进行遍历的,完全可以替代上面的eof+fgets的方式。

关于普通的面向过程的文件操作函数的学习我们在之前的文章中已经学习过了,当中大部分的函数在SplFileInfo和SplFileObject中都可以找到对应的实现,这里就不进行更多的演示了。如果对文件操作相关函数还有什么疑问的同学,可以移步之前的文章再温习一下:

PHP中的文件系统函数(一):
转载请注明原文网址:http://www.coolofsoul.com/phpys/phpys/24187.html

------分隔线----------------------------