在PHP中使用fopen
而不是SplFileObject
有什么优缺点?
从我看到的情况来看,SplFileObject
会在适用的情况下抛出异常,这使得使用try...catch
进行错误处理时非常方便。除此之外,还有其他理由推荐其中一个吗?
(奖励:为什么称为SplFileObject
?Spl
代表什么?为什么不简单FileObject
?)
更新: SplFileObject
的一个限制是它(还)没有close
成员函数。在某些情况下,这可能是一个问题(例如:Unlink and SplFileObject)。
答案 0 :(得分:18)
SPL代表标准PHP库。
SplFileObject
在内部使用由fopen
创建的流资源。因此,您的问题应该是何时使用SplFileObject
或直接使用流资源?
SplFileObject
专业人士:
SplFileObject
为文件操作提供了OOP方法(在PHP 5.5.11中添加了fread
,在PHP 5.4中添加了fputcsv
。)
SplFileObject
实现了几个有用的PHP接口,可以使用其他SPL Iterator来更好地操作您的文件。
SplFileObject
主要的缺点是它不能访问它
内部流资源。 PHP函数最初构建为直接使用流资源。 SplFileObject
无法访问自己的内部流资源这一事实使得许多PHP内置函数无法使用它:
php stream filters使用SplFileObject
时效果不佳。您需要依赖php://filter
元包装器,这限制了它们的用途。
无法使用SplFileObject
cURL
总结SplFileObject
并且流资源不可互换。 使用SplFileObject
完成的任何操作都可以使用流资源和SplFileObject
用户区实现来实现,但反之则不然。
因此,根据使用fopen
创建的流资源的用例,可能是比依赖SplFileObject
更好的选择。
至于close方法,你不需要一个...你只需要将处理程序设置为null来释放/关闭内部流资源。
$file = new SplFileObject('/path/to/my/file'); //the file handler is created
$file = null; //the file handler is closed
答案 1 :(得分:4)
Spl代表标准PHP库。
主要优点是面向对象,它更适合某些方法(不适用于所有方法)。如果您必须提供处理文件的类(如自定义格式等),这是一个很好的选择,因为您可以从SplFileObject
继承并且已经内置了基本功能。
这里的主要问题是你想用你的代码实现什么 - 你需要打开一个文件,读取它的数据然后使用它还是你需要做一个更复杂的东西(甚至更多) )文件。
答案 2 :(得分:1)
Spl是Php中的标准库,它制作了很多不错的东西。
使用SplFileObject的一个好理由是它使您的代码面向对象。如果你愿意,你可以在你自己的代码库中扩展这个类,并在使用文件时使它做一些很好的东西,已经涵盖了基础知识。