SplFileObject vs fopen在PHP中

时间:2012-08-07 17:01:54

标签: php file-io fopen spl splfileobject

在PHP中使用fopen而不是SplFileObject有什么优缺点?

从我看到的情况来看,SplFileObject会在适用的情况下抛出异常,这使得使用try...catch进行错误处理时非常方便。除此之外,还有其他理由推荐其中一个吗?

(奖励:为什么称为SplFileObjectSpl代表什么?为什么不简单FileObject?)

更新: SplFileObject的一个限制是它(还)没有close成员函数。在某些情况下,这可能是一个问题(例如:Unlink and SplFileObject)。

3 个答案:

答案 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的一个好理由是它使您的代码面向对象。如果你愿意,你可以在你自己的代码库中扩展这个类,并在使用文件时使它做一些很好的东西,已经涵盖了基础知识。