PHP中的SplFileObject与fopen有何不同?

17

fopenSplFileObject 在 PHP 中使用有什么优缺点呢?

从我所看到的来看,SplFileObject 会在适当的时候抛出异常,这使得在错误处理时使用 try...catch 更加方便。除此之外,还有其他推荐一种而不是另一种的原因吗?

(附加题:为什么称其为 SplFileObjectSpl 指什么?为什么不直接使用 FileObject?)

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


2
你可能想在这里使用[spl]标签。那些跟随它的少数人通常非常热情和有知识。 - goat
3个回答

20

SPL代表标准PHP库。

SplFileObject在内部使用使用fopen创建的流资源。因此,你应该问什么时候使用SplFileObject或直接使用流资源更有趣?

SplFileObject优点:

  • SplFileObject提供了一种面向对象的文件操作方法(fread在PHP 5.5.11中添加,fputcsv在PHP 5.4中添加)。

  • SplFileObject实现了几个有用的PHP接口,以使其他SPL迭代器能更好地操作您的文件。

SplFileObject的主要缺点是它不能访问其内部流资源。PHP函数最初是为直接与流资源一起工作而构建的。SplFileObject不允许访问其自己的内部流资源,这使其无法与许多PHP内置函数一起使用:

  • php流过滤器使用SplFileObject效果不佳。您需要依赖于php://filter元包装器,这限制了它们的有用性。

  • 无法使用SplFileObjectcURL

总之,SplFileObject和流资源不可互换。使用SplFileObject完成的任何操作都可以使用流资源和SplFileObject用户实现来实现,但反过来则不行。

因此,根据用例,使用fopen创建的流资源可能比依赖于SplFileObject更好。

至于关闭方法,你不需要一个...你只需要将处理程序设置为null以释放/关闭内部流资源。

$file = new SplFileObject('/path/to/my/file'); //the file handler is created
$file = null; //the file handler is closed

4
Spl代表标准PHP库。
其主要优点是面向对象,这对于某些方法更为合适(并非所有方法都适用)。如果您需要提供处理文件的类(如自定义格式等),则可以从SplFileObject继承,并已经内置了基本功能。
在这里主要问题是您想通过代码实现什么 - 您是需要打开一个文件、读取数据并进行操作,还是需要对一个或多个文件进行更复杂的操作。

我在项目中有一个页面,需要加载CSV文件并填充数据库。我在每个页面中都使用try...catch来处理错误。我认为在这里使用SplFileObject是一个不错的选择,对吗? - Agnel Kurian
2
我个人更喜欢将数据放入数据库,因为您可以进行更精细的错误处理,所以在这种一般情况下,我会选择这种方法,因为我想记录错误等。但是,如果您可以确定文件输入(不损坏,来自自动化源等),那么您可能可以选择 fgetscsv - Florian

1

Spl是Php中的标准库,提供了很多好用的功能。

使用SplFileObject的一个好处是可以使你的代码面向对象化。如果你想的话,还可以在自己的代码库中扩展该类,并在使用文件时完成一些不错的操作,同时已经基本涵盖了一些基础功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接