【问题标题】:SplFileObject vs fopen in PHPPHP 中的 SplFileObject 与 fopen
【发布时间】:2012-08-07 17:01:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可能想在这里使用 [spl] 标签。关注它的少数人通常非常热情和知识渊博。

标签: php file-io fopen spl splfileobject


【解决方案1】:

SPL 代表标准 PHP 库。

SplFileObject 在内部使用fopen 创建的流资源。所以你的问题应该是什么时候使用SplFileObject 或直接使用流资源?

SplFileObject 专业人士:

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

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

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

  • php stream filtersSplFileObject 的使用效果不佳。您需要依赖 php://filter 元包装器,这限制了它们的用处。

  • 无法将SplFileObjectcURL 一起使用

总结起来SplFileObject 和流资源是不可互换的。 使用SplFileObject 完成的任何事情都可以使用流资源和SplFileObject 用户区实现来实现,但反之则不然

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

至于close方法,你不需要...你只需要设置handler为null就可以释放/关闭内部流资源。

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

【讨论】:

    【解决方案2】:

    Spl 代表标准 PHP 库。

    主要优点是面向对象,它更适合某些方法(不是所有方法,也就是说)。如果您必须提供用于处理文件的类(如自定义格式等),这是一个不错的选择,因为您可以从 SplFileObject 继承并且已经内置了基本功能。

    这里的主要问题是你想用你的代码实现什么 - 你需要打开一个文件一次,读取它的数据然后使用它,还是你需要用一个(甚至更多) 文件。

    【讨论】:

    • 我的项目中有这一页,我在其中加载 CSV 文件并填充数据库。我在每个页面中都使用try... catch 进行错误处理。我认为SplFileObject 是一个不错的选择吗?
    • 我个人更喜欢将它用于您想要放入数据库的数据,因为您可以进行更精细的错误处理,所以我会在这个常规设置中自己尝试,因为我想记录错误等。但是,如果您可以确定文件输入(未损坏,来自自动来源等),您可能会选择fgetscsv
    【解决方案3】:

    Spl 是 PHP 中的一个标准库,可以制作很多好东西。

    使用 SplFileObject 的一个很好的理由是它使您的代码面向对象。如果你愿意,你可以在你自己的代码库中扩展这个类,让它在使用文件时做一些很好的事情,已经涵盖了基础知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多