【问题标题】:PHP empty var == 0?PHP 空变量 == 0?
【发布时间】:2012-03-17 04:42:21
【问题描述】:

在 php 5 中

  $my_var = "";

  if ($my_var == 0) {
    echo "my_var equals 0";

  }

为什么它评估为真? php.net中有没有关于它的参考?

【问题讨论】:

    标签: php variables evaluation


    【解决方案1】:

    PHP is a weakly typed language。当使用相等运算符== 进行测试时,空字符串和布尔值 false 将评估为 0。另一方面,您可以通过使用相同的运算符=== 来强制它检查类型:

    $my_var = "";
    
    if ($my_var === 0) {
       echo "my_var equals 0";
    } else {
       echo "my_var does not equal 0";
    }
    

    这应该会为您提供有关该主题的大量信息:How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

    【讨论】:

      【解决方案2】:

      字符串和整数不能与== 直接比较。所以 PHP 会执行类型杂耍,看看是否有其他合理的比较可用。

      当一个字符串与一个整数进行比较时,字符串首先被转换为一个整数。您可以找到转换的详细信息here。基本上,由于"" 不是有效数字,因此转换的结果是0。因此,比较变成了0 == 0,这显然是正确的。

      您可能希望对大多数(如果不是全部)比较使用身份比较 ===

      【讨论】:

        【解决方案3】:

        这是由于您使用的相等运算符的类型强制。

        PHP manual 有类型比较表来阐明这一点。

        通常认为使用相同的运算符=== 是一种很好的做法,以避免出现这种角落(?)情况。

        【讨论】:

          【解决方案4】:

          在第一行中,将$my_var 定义为字符串。

          在比较中,您将该变量与一个常量整数进行比较。

          如果你想要精确比较(我不知道为什么你需要将一个字符串与一个没有任何强制转换的整数进行比较),你应该使用===

          if ($my_var === 0) {
            echo "my_var equals 0";
          }
          

          这永远不会回显消息。

          PHP手册在Comparison Operators section中定义,运算符==为:

          如果在类型杂耍之后 $a 等于 $b,则为 TRUE。

          所以,这里重要的是type juggling

          事实上,在PHP Manual: types comparisons 中,第二个表准确地告诉你整数0 等于字符串""

          【讨论】:

            【解决方案5】:

            这里是 php 手册中关于布尔值的参考

            http://www.php.net/manual/en/language.types.boolean.php

            这里是NULL值的参考

            http://www.php.net/manual/en/language.types.null.php
            
            $my_var = '';
            
            if ($my_var == 0) {
                echo "my_var equals 0"
            }
            

            评估为真,因为“”与评估为假或 0 的 NULL 相同

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-10-30
              • 1970-01-01
              • 2011-09-10
              • 2014-03-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多