关于此主题有some SO questions,但没有一个用算法描述回答它,因为它存在于JS(ECMAScript)中。它似乎不存在于PHP文档中。
我不是C开发人员,我甚至无法在PHP sources中找到相应的代码。如果我不能告诉为什么(松散,==
)将字符串/数字/资源与对象/数组进行比较似乎总是返回false,我将无法再睡好了?
EG。为什么'' == []
为false
,或为什么'foo' == ['foo']
为false
。
答案 0 :(得分:3)
PHP文档中有多个页面专门用于与==
运算符进行松散比较。对于对象,请参阅Comparing Objects:
当使用比较运算符(==)时,对象变量以简单的方式进行比较,即:如果两个对象实例具有相同的属性和值(值与==进行比较),则它们是相等的,并且是同一个班级。
有关其他类型之间的宽松比较,请参阅PHP type comparison tables。
答案 1 :(得分:2)
我终于从this blog of a security expert(Gynvael)和阅读源代码中找到了一个几乎令人满意的答案。从前者开始,我只引用回答我最初问题的部分:为什么(松散,==)将字符串/数字/资源与对象/数组进行比较似乎总是返回false?可以找到负责等效比较(==
)的算法here。
相等运算符的主要机制在php-src / Zend / zend_operators.c中的compare_function中实现,但是很多情况下调用其他函数或使用大宏(然后调用其他使用更多宏的函数),所以读这个并不太令人愉快。
操作员基本上分两步工作:
如果两个操作数都是compare_function知道如何比较的类型,则比较它们。此行为包括以下几对类型(请注意,相等运算符是对称的,因此A与B的比较与B与A相同): •LONG vs LONG •LONG vs DOUBLE(+对称) •DOUBLE与DOUBLE •ARRAY vs ARRAY •NULL与NULL •NULL vs BOOL(+对称) •NULL与OBJECT(+对称) •BOOL vs BOOL •STRING与STRING •和OBJECT vs OBJECT
- 醇>
如果上面列表中没有这对类型,则compare_function会尝试将操作数转换为第二个操作数的类型(如果是带有cast_object处理程序的OBJECT),则转换为BOOL(如果是第二种类型是NULL或BOOL),或者在大多数其他情况下转换为LONG或DOUBLE。在演员之后,重新运行compare_function。
我认为所有其他情况都会返回false。