我已经相当确信这只是一个漏洞百出的抽象,让它看起来很难看,但在提交一个bug报告之前,我想我可能会在堆栈溢出中寻找一个更具洞察力的答案…
我正在用PHP编写一个类来帮助自动加载。我讨厌使用Zend框架使用的那些荒谬的面向路径的类名,所以我编写了一个类,它创建了一个对象,递归地遍历一个目录及其子目录,查找所有PHP源文件,并将其解析为类定义,然后将其缓存并重用,直到自动加载失败,这会提示对象更新其索引。
我喜欢尽可能使用内置的PHP类,因此对于索引路径,我使用了
SplFileInfo
班级。
更新类索引所需的某些操作要求我搜索
拼图信息
对象,我的对象持有,这是我在使用比较运算符
拼图信息
对象。
简而言之,搜索任何文件都会返回true。起初我有点困惑,但我在两台机器上试过,有一个朋友也在他身上试过——同样的结果。似乎不管怎样,当你比较两个
拼图信息
使用比较的对象(
==
)运算符,它返回true,即使它们指向完全位于目录中的不同文件。无论我是否使用循环迭代数组中的每个元素并以这种方式进行比较,请使用
in_array()
或
array_search()
,它总是返回true,并提供对完全不同的文件的引用。
我再往前看了看,发现那个识别员(
===
)总是返回false,即使两个
拼图信息
对象指向完全相同的文件,并用相同的路径字符串初始化。
对于我的代码,这意味着当我去更新类索引以查看是否有任何新文件时,即使文件是新的,索引器对象认为它已经知道该文件并继续。我已经通过比较路径名字符串来实现这一点,但是这样会破坏使用
拼图信息
要开始的类。
PHP手册说,扩展开发人员可以为对象重载比较运算符,这就是为什么我假设
拼图信息
足够聪明,可以解析相对路径,并将其与其他相对路径(例如
./file
和
file
一律平等。事实证明,在那些情况下,它只是返回true,因为
总是
比较两个值时返回true
拼图信息
物体!
这与我正在处理的代码没有关联。我尝试了一个新的草稿源文件
SPLFileInfo(特殊文件信息)
对象,并进行比较。如果对象指向不同的文件、相同的文件和不存在的文件,则返回true。
由于这不是PHP中对象上比较运算符的默认行为,因此扩展中类的定义中必须有导致这种情况发生的内容。
有没有人知道它为什么会这样做,或者有什么见解?