将自定义 FileInfo 类设置为迭代器的正确方法
题
我试图通过以下方式将自定义类设置为迭代器 setInfoClass
方法:
使用此方法设置一个自定义类,该类将在调用 getFileInfo 和 getPathInfo 时使用。传递给此方法的类名必须派生自 SplFileInfo。
我的课程是这样的(简化示例):
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
迭代器代码是这样的:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
自从 RecursiveDirectoryIterator
是通过继承 DirectoryIterator
还有一个 SplFileInfo
对象,它提供了 setInfoClass
方法。它没有在手册中列出,但反射表明它在那里:
shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ <optional> $class_name ]
}
}
到这里一切都很好,但是当使用以下命令迭代目录时
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump( $file );
}
我得到以下奇怪的结果
object(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
所以虽然 MyFileInfo
已拾取,我无法访问它的属性。如果我添加自定义方法,我可以很好地调用它们,但任何属性都是未知的。
如果我不将信息类设置为迭代器,而是设置为 SplFileInfo 对象(如手册中的示例所示),它将给出相同的未知结果:
foreach($rit as $file) {
// $file is a SplFileInfo instance
$file->setInfoClass('MyFileInfo');
var_dump( $file->getFileInfo() );
}
但是,当我这样做时它会起作用
foreach($rit as $file) {
$file = new MyFileInfo($file);
var_dump( $file );
}
不幸的是,我想使用它的代码有点复杂,并且堆叠了更多迭代器。像这样创建 MyFileInfo 类不是一个选项。
那么,有谁知道如何让它工作或者为什么 PHP 的行为如此奇怪?
谢谢。
解决方案
无法告诉你确切的原因,但它适用于
class MyFileInfo extends SplFileInfo
{
public $props;
public function __construct($filename) {
$this->props = array(
'foo' => '1',
'bar' => '2'
);
parent::__construct($filename);
}
}
不隶属于 StackOverflow