【问题标题】:Why is integer 0 equal to a string in PHP? [duplicate]为什么整数 0 等于 PHP 中的字符串? [复制]
【发布时间】:2012-12-07 21:03:02
【问题描述】:

可能重复:
How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?

为什么会这样

var_dump(0 == "string");

输出这个

bool(true)

== 运算符的上下文不是应该根据this set of rules 将0 转换为FALSE 和"string" 转换为TRUE 吗?

【问题讨论】:

  • 试试===,我想它会给你错误的。
  • 但即使作为比较,这也应该是错误的,不是吗?
  • 解释这种行为:您正在比较一个整数和一个字符串。 PHP 将字符串转换为 int,即 0(因为它不包含任何数字表示)。 0 == 0 显然是正确的。
  • PHP 的第一条规则。学会不要对任何事情感到惊讶。

标签: php types casting type-conversion


【解决方案1】:
var_dump(0 == "string");

正在进行数字(整数)比较

0是整数,所以“string”转换成整数做比较,等于0的整数值,所以0 == 0为真

详情请参阅 PHP 文档中的comparison with various types table

【讨论】:

  • 在 PHP 中一个非空字符串等价于整数 0 仍然很奇怪,这与 C 的概念冲突,而 PHP 声称受 C 的影响。在 C 中,非空 something 转换为 true 或等效整数 1。
  • @Desmond 如果将"string" 转换为数字并且字符串不包含任何数值,则0 是唯一合乎逻辑的选择。如果您将"string" 转换为bool,它将转换为true,除非它为空(对于PHP 的“空”定义)。将"string" 转换为数字并得到1 一样不合逻辑,您只需要学习规则即可。
  • 您好,请您解释一下为什么 filter_var(0, FILTER_VALIDATE_INT) 返回 false?。
  • 我哭了.....
【解决方案2】:

table shown here 更适合您的情况。

它显示TRUE 用于比较0 和"php"。

在比较过程中,您不会将两个操作数都转换为布尔值,但会转换一个操作数以匹配另一个操作数的类型。在您的情况下,字符串被转换为整数,这导致另一个0。这给了你0 == 0,结果为真。

【讨论】:

    【解决方案3】:

    它们不是同一类型,如果要检查它们是否也属于同一类型,请使用 ===。

    【讨论】:

      【解决方案4】:

      PHP: ==

      如果您将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为数字,然后 以数字方式进行比较。

      "string"不是数字格式,所以会转换成0。

      【讨论】:

        【解决方案5】:

        在比较过程中,字符串被转换为整数:

        var_dump(0);
        var_dump((int)"string");
        var_dump(0 == "string");
        

        最后一行将自动转换为:

        var_dump(0 == (int)"string");
        

        所以这个返回将返回:

        int(0)
        int(0)
        bool(true)
        bool(true)
        

        【讨论】:

          【解决方案6】:

          您首先在此站点上查找比较表:http://php.net/manual/en/language.operators.comparison.php。投射到 bool 不适用于此处。

          Operand 1           Operand 2
          ...
          string, resource    string, resource    Translate strings and resources to numbers,
          or number           or number           usual math
          

          "string" 转换为 数字 等于 0。

          【讨论】:

            猜你喜欢
            • 2011-10-14
            • 1970-01-01
            • 2021-12-13
            • 1970-01-01
            • 2013-07-09
            • 2020-09-15
            • 2012-01-30
            • 2012-06-07
            • 2020-08-22
            相关资源
            最近更新 更多