php - php 类型比较背后的基本原理

标签 php types comparison boolean-operations

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

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

这是一个有用的引用,但我不想每次都访问此页面以确保我正在正确地进行类型比较。所以我的问题是

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

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

  • 1、-1、“1”和“-1”可以作为TRUE处理,0和“0”可以作为FALSE处理;
  • 将数字的字符串值与数字本身进行比较,yield TRUE;

但从那时起试图建立一个模式就变得有点毛茸茸了。

最佳答案

对于直接转换为 bool 值,这就是它的工作原理。

  • 所有长度大于 0 的字符串都为真
  • 所有非0数都为真
  • 所有非空数组都为真
  • 所有对象都为真

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

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

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

===!== 运算符不会在比较之前进行转换,但您应该注意对象只有 === 如果他们是同一个实例。

真正奇怪的是数组,如果它们具有以相同顺序定义的相同键和值,则它们是===

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

$a == $b; // true
$a === $b; // false

empty()等同于!(bool)$var

异常(exception)情况

  • 将数组转换为字符串会触发通知,但无助于转换为文本 Array
  • 将没有__toString 方法的对象转换为字符串会导致 fatal error 。
  • 对象不会隐式转换为数组,因此任何时候将对象与数组进行比较都会产生错误(UPDATE 确认这是正确的,即使对象实现了ArrayAccess 界面)

关于php - php 类型比较背后的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16048283/

相关文章:

php - 从两个表内连接中删除*

php - 从url获得一些值(value)?

php - Laravel 用户特定的缓存

java - 对象变量类型是什么意思?

comparison - 文本文件比较软件

php - jQuery数据表在PHP中不起作用

java - 在 JDBC 中,何时使用时间、日期和时间戳

c# - 如何确定类型是否为结构?

opengl - GLSL 组件方式相等比较

php - 身份条件 "==="、性能和转换