php类型比较背后的基础哲学

Tol*_*ayi 5 php comparison types boolean-operations

所以php网站上有这个页面显示比较不同值的结果:

http://php.net/manual/en/types.comparisons.php

这是一个有用的参考,但每次我想确保我正在进行类型比较时,我宁愿不必访问此页面.所以我的问题是

在PHP的类型比较逻辑背后是否存在某种潜在的哲学/推理?

例如,我可以看到松散的比较:

  • 1,-1,"1"和"-1"可以视为TRUE 0和"0"可以视为FALSE;
  • 比较数字的字符串值与数字本身的比率为TRUE;

但是在尝试建立模式时,它变得有点毛茸茸.

Ora*_*ill 6

对于直接转换为布尔值,这是它的工作原理.

  • 长度> 0的所有字符串都为true
  • 所有非0数字都是真的
  • 所有非空数组都是正确的
  • 所有对象都是真的

然后这些规则用于比较相同类型的变量:

  1. 如果对象的属性相等,则它们是等效的
  2. 如果它们的键和元素相等,则数组是等价的
  3. 如果字符串产生相同的输出,则它们是等效的
  4. 如果它们在数学上是等价的,则数字是等价的
  5. 如果布尔值具有相同的值,则它们是等价的.

对于不同类型的变量,上面列表中较高的类型将转换为低于进行比较的类型.

===并且!==运算符在比较之前不会进行转换,但是只有===当对象是同一个实例时才应该注意它们.

真正奇怪的是数组,它们是===相同的键和值以相同的顺序定义.

$a = array("a"=>1, "b"=>2);
$b = array("b"=>2, "a"=>1);

$a == $b; // true
$a === $b; // false
Run Code Online (Sandbox Code Playgroud)

empty()相当于!(bool)$var

例外

  • 将数组转换为字符串将触发通知并无益地转换为文本 Array
  • 将没有__toString方法的对象 转换为字符串会导致致命错误.
  • 对象不会隐式地转换为数组,因此每次将对象与数组进行比较时都会产生错误(UPDATE确认即使对象实现了ArrayAccess接口也是如此)