比较SplFileInfo对象始终返回true

时间:2010-01-25 05:29:14

标签: php

我已经非常相信自己这只是漏洞的抽象,让人头疼,但我在提交错误报告之前想到了,我可能会调查Stack Overflow以获得更有见地的答案......

我正在用PHP编写一个类来辅助自动加载。我讨厌使用Zend框架使用的荒谬的,面向路径的类名,所以我改为编写一个类来创建一个对象,以递归方式遍历目录及其子目录,查找所有PHP源文件,并为类解析它们定义,然后缓存并重复使用,直到自动加载失败,这会提示对象更新其索引。

我喜欢尽可能使用内置的PHP类,因此对于索引路径,我使用了SplFileInfo类。

更新类索引所需的一些操作要求我搜索我的对象所持有的SplFileInfo个对象数组,这是我在{{{{{{{{{ 1}}对象。

简单地说,搜索任何文件总是返回true。起初我对它感到有些困惑,但是我已经在两台机器上尝试了它并且让一个朋友尝试了它 - 同样的结果。看似无论如何,当您使用比较(SplFileInfo)运算符比较两个SplFileInfo对象时,它返回true,即使它们指向位于完全目录中的不同文件。无论我是使用循环迭代数组中的每个元素并进行比较,使用==in_array(),它总是返回true并给我一个完全不同的文件的引用。

我进一步探索并发现识别运算符(array_search())总是返回false,即使两个===对象指向完全相同的文件,也使用相同的路径字符串进行初始化。 / p>

对于我的代码,这意味着当我去更新类索引以查看是否有任何新文件时,即使文件是新文件,索引器对象也认为它已经知道该文件并继续前进。我通过比较路径名字符串使这个工作起作用,但这种方法违背了使用SplFileInfo类开始的目的。

PHP手册说扩展开发人员可以重载对象的比较运算符,这就是为什么我假设SplFileInfo足够智能来解析相对路径并将其与其他相对路径进行正确比较,例如SplFileInfo./file相等。事实证明,它只是在那些实例中返回true,因为在比较两个file对象时总是返回true!

这与我正在处理的代码无关。我尝试了一个带有一些新SplFileInfo对象的临时源文件,并对它们进行了比较。无论对象是指向不同的文件,同一文件还是不存在的文件,它都返回true。

由于这不是PHP中对象的比较运算符的默认行为,因此扩展中的类的定义中必定存在导致此问题的内容。

有没有人知道它为什么会这样,或有任何见解?

1 个答案:

答案 0 :(得分:2)

安德鲁,

我已经完成了一些使用SPL类的自我实验,而且令人惊讶的是,SplFileInfo并不是唯一展示此行为的SPL类。例如,ArrayIterator也以同样的方式做出反应。我认为更多(如果不是全部)SPL类都有这种行为。

虽然我没有回答为什么会出现这种情况,但我确实针对您的具体情况提供了解决方法。你可能已经自己想出了这个,但我认为无论如何我都会分享它:

class MyFileInfo extends SplFileInfo
{
    private $_realPath;

    public function __construct( $path )
    {
        parent::__construct( $path );
        $this->_realPath = $this->getRealPath();
    }

}