PHP算法(松散)等式比较

时间:2017-12-25 14:55:08

标签: php

关于此主题有some SO questions,但没有一个用算法描述回答它,因为它存在于JS(ECMAScript)中。它似乎不存在于PHP文档中。

我不是C开发人员,我甚至无法在PHP sources中找到相应的代码。如果我不能告诉为什么(松散,==)将字符串/数字/资源与对象/数组进行比较似乎总是返回false,我将无法再睡好了?

EG。为什么'' == []false,或为什么'foo' == ['foo']false

2 个答案:

答案 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中实现,但是很多情况下调用其他函数或使用大宏(然后调用其他使用更多宏的函数),所以读这个并不太令人愉快。

     

操作员基本上分两步工作:

     
      
  1. 如果两个操作数都是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

  2.   
  3. 如果上面列表中没有这对类型,则compare_function会尝试将操作数转换为第二个操作数的类型(如果是带有cast_object处理程序的OBJECT),则转换为BOOL(如果是第二种类型是NULL或BOOL),或者在大多数其他情况下转换为LONG或DOUBLE。在演员之后,重新运行compare_function。

  4.   

认为所有其他情况都会返回false。