gpt4 book ai didi

php - 将自定义 FileInfo 类设置为 Iterator 的正确方法

转载 作者:可可西里 更新时间:2023-11-01 13:29:04 25 4
gpt4 key购买 nike

我正在尝试通过 setInfoClass 将自定义类设置为迭代器方法:

Use this method to set a custom class which will be used when getFileInfo and getPathInfo are called. The class name passed to this method must be derived from 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);
}
}

关于php - 将自定义 FileInfo 类设置为 Iterator 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com