使用 fread 方法扩展 SplFileObject

extend SplFileObject with fread method

提问人:mario 提问时间:10/14/2010 更新时间:7/8/2014 访问量:1612

问:

PHP5 引入了一个面向对象的文件包装器 SplFileObject。我想我刚刚发现为什么几乎没有人使用它。它纯粹是面向行的,没有 fread() 方法 - 相应的 frwite 似乎暗示了这一点。

所以现在我想知道我是否可以扩展它。但是,我不确定什么是更好的解决方法。SplFileObject 在隐藏文件指针 ($fp) 方面并不是特别有用 - 它要么是私有属性,要么是 ZE 内部资源。那么我该如何扩展它以获得 fread 方法呢?

  • 使用 fgets() 将 fread() 实现为字符串收集循环,如果只请求特定大小并且 fgets 读取得太远,直到下一个 \n 换行符,则最终会进行搜索。
  • 使用自定义构造函数,该构造函数会再次打开文件并存储辅助文件指针,以防我想调用 fread() 而不是父类方法。

我会选择fget变通循环,但它听起来很麻烦和缓慢,并且提供了更多潜在的陷阱。OTOH 打开辅助文件指针似乎也不是一个好方法,也需要自定义析构函数。

PHP的

评论

0赞 rojoca 10/14/2010
你需要做什么?fread()
0赞 mario 10/14/2010
读取整个文件。只是想传递一个文件对象以使其元信息可用。
1赞 rojoca 10/14/2010
在这种情况下,只需添加一个调用 .如果您希望能够使用,最好定义自己的自定义类,该类使用文件处理函数本身实现所需的所有功能。file_get_contents($this->getPathname());fread
0赞 mario 10/14/2010
好主意。我将添加file_get_contents作为额外的方法,因为我主要使用它。但无论如何,我更喜欢连贯的文件类。从整体上重新实现它似乎是不利的(也破坏了 SplFileinfo 的兼容性)。

答:

5赞 Artefacto 10/14/2010 #1

您可以调用 extend it 并添加一个方法,该方法重复调用该方法,达到所需的次数。freadfgetc

也就是说,我同意这是一个奇怪的限制。提交功能请求。如果我没有遗漏什么,就应该实施方法。fread

评论

0赞 mario 10/14/2010
是的,我想 fgets 解决方法是更好的方法。- 在 php.net 上确实发现了一个未解决的错误/功能请求,一些关于 2006 年的想法,似乎没有实际的计划来添加它。SplBinaryFileObject
2赞 W4cko 7/8/2014 #2

PHP5.6 新增功能

.添加了功能 #65545 (SplFileObject::fread()) (Tjerk)

从 https://github.com/php/php-src/blob/php-5.6.0RC2/NEWS