代码之家  ›  专栏  ›  技术社区  ›  Andrew Noyes

比较splfileinfo对象始终返回true

php
  •  4
  • Andrew Noyes  · 技术社区  · 14 年前

    我已经相当确信这只是一个漏洞百出的抽象,让它看起来很难看,但在提交一个bug报告之前,我想我可能会在堆栈溢出中寻找一个更具洞察力的答案…

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

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

    更新类索引所需的某些操作要求我搜索 拼图信息 对象,我的对象持有,这是我在使用比较运算符 拼图信息 对象。

    简而言之,搜索任何文件都会返回true。起初我有点困惑,但我在两台机器上试过,有一个朋友也在他身上试过——同样的结果。似乎不管怎样,当你比较两个 拼图信息 使用比较的对象( == )运算符,它返回true,即使它们指向完全位于目录中的不同文件。无论我是否使用循环迭代数组中的每个元素并以这种方式进行比较,请使用 in_array() array_search() ,它总是返回true,并提供对完全不同的文件的引用。

    我再往前看了看,发现那个识别员( === )总是返回false,即使两个 拼图信息 对象指向完全相同的文件,并用相同的路径字符串初始化。

    对于我的代码,这意味着当我去更新类索引以查看是否有任何新文件时,即使文件是新的,索引器对象认为它已经知道该文件并继续。我已经通过比较路径名字符串来实现这一点,但是这样会破坏使用 拼图信息 要开始的类。

    PHP手册说,扩展开发人员可以为对象重载比较运算符,这就是为什么我假设 拼图信息 足够聪明,可以解析相对路径,并将其与其他相对路径(例如 ./file file 一律平等。事实证明,在那些情况下,它只是返回true,因为 总是 比较两个值时返回true 拼图信息 物体!

    这与我正在处理的代码没有关联。我尝试了一个新的草稿源文件 SPLFileInfo(特殊文件信息) 对象,并进行比较。如果对象指向不同的文件、相同的文件和不存在的文件,则返回true。

    由于这不是PHP中对象上比较运算符的默认行为,因此扩展中类的定义中必须有导致这种情况发生的内容。

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   Decent Dabbler    14 年前

    安德鲁,

    我做了一些试验 SPL 类,令人惊讶的是,splfileinfo并不是唯一显示这种行为的spl类。例如,arrayIterator的反应也一样。我假设更多(如果不是全部)SPL类具有这种行为。

    虽然我不知道为什么会有这种行为,但我确实有一个针对您具体情况的解决方案。你可能已经自己想出来了,但我想我还是会分享:

    class MyFileInfo extends SplFileInfo
    {
        private $_realPath;
    
        public function __construct( $path )
        {
            parent::__construct( $path );
            $this->_realPath = $this->getRealPath();
        }
    
    }