【问题标题】:The if statement doesn't work for false in phpif 语句不适用于 php 中的 false
【发布时间】:2015-06-23 06:47:39
【问题描述】:

在尝试熟悉 PHP 中的 if 语句时,发生了这种情况。 我第一次尝试下面的代码。

if(true) {echo 'true';} else {echo 'false';}

当条件为true 时,输出为true。同样,当条件为false (if(false)) 时,它会回显false

但我尝试了同样的方法,使用变量作为条件,同时更改变量的值。

$con='false';
if($con){echo 'true';} else{echo 'false';} 

在这种情况下,即使变量值为falsetrue,输出也是true。同时,if statement 在使用10 时工作正常,而不是truefalse。为什么会这样?

【问题讨论】:

  • 这么多.. 答案:O

标签: php if-statement


【解决方案1】:
$con='false';

'false' 是一个有效的字符串,它不是布尔值 FALSE,就像 $con='hi'; 不是。

$con=FALSE;  //this is false now

引自Manual

要指定布尔文字,请使用常量 TRUE 或 FALSE。两者都不区分大小写。

还请阅读您拥有的这些其他选项

当转换为布尔值时,以下值被视为 FALSE:

◦ 布尔值 FALSE 本身
◦ 整数 0(零)
◦ 浮点数 0.0(零)
◦ 空字符串和字符串“0”
◦ 零元素数组
◦ 具有零个成员变量的对象(仅限 PHP 4)
◦ 特殊类型 NULL(包括未设置的变量)
◦ 从空标签创建的 SimpleXML 对象

然后你观察到了这个

同时,if 语句在使用 1 和 0 代替 true 和 false 时工作正常。为什么会这样?

这是因为任何形式的 0 都是 FALSE,无论是字符串还是数字。但是由于上述原因,文本false 作为字符串并不为假。

由于您正在学习,还请阅读有关 PHP Strict Comparisons 的信息,因为

var_dump(0==FALSE);    //bool(true)
var_dump(0===FALSE);   //bool(false)   :)

【讨论】:

    【解决方案2】:

    PHP 在 if 表达式中做了一些偷偷摸摸的事情。以下值被视为 FALSE:

    • 布尔值 FALSE 本身
    • 整数 0(零)
    • 浮点数 0.0(零)
    • 空字符串和字符串“0”
    • 零元素的数组
    • 一个成员变量为零的对象(仅限 PHP 4)
    • 特殊类型 NULL(包括未设置的变量)
    • 从空标签创建的 SimpleXML 对象

    所有其他值都被视为 TRUE(包括任何资源)。

    您实际上是在传递一个表示单词 false 的字符串,而不是值 false 本身。因为那不在上面的列表中,所以它实际上被认为是真实的!

    【讨论】:

      【解决方案3】:

      正如关于表达式的部分所述,表达式被计算为其布尔值。如果表达式计算结果为 TRUE,PHP 将执行语句,如果计算结果为 FALSE - 它会忽略它。有关哪些值评估为 FALSE 的更多信息,请参阅'Converting to boolean' 部分。

      所以按照文档尝试使用

      $con = false;//boolean and not a string
      if($con){echo 'true';} else{echo 'false';} 
      

      当转换为布尔值时,以下值被认为是 FALSE:

      ◦ 布尔值 FALSE 本身
      ◦ 整数 0(零)
      ◦ 浮点数 0.0(零)
      ◦ 空字符串和字符串“0”
      ◦ 零元素数组
      ◦ 具有零个成员变量的对象(仅限 PHP 4)
      ◦ 特殊类型 NULL(包括未设置的变量)
      ◦ SimpleXML 对象从空标签创建

      Check Docs (IF MANUAL)

      【讨论】:

        【解决方案4】:

        您使用 'false' 作为 STRING 变量,但那是 WORD false,而不是 BOOLEAN 常量。只需使用 false

        if(true) {echo 'true';} else {echo 'false';}
        
        $con='false';  // Wrong
        $con=false; // Right
        if($con){echo 'true';} else{echo 'false';} 
        

        当您执行 if 语句时,这将起作用:

        if ($con == false) { echo 'false'; }
        

        或者您可以使用 === 按值和类型将一个表达式与另一个表达式进行比较。

        if ($con === false) { echo 'false with type safe comparison!'; }
        

        【讨论】:

          【解决方案5】:

          使用布尔值代替字符串:

          $con = false;
          

          您的 if 语句将简单地检查 $con 是否为空,因此在您的示例中它将始终为真。

          【讨论】:

          • “从 PHP 5.3 开始”?在最近的历史中,布尔比较没有任何变化。
          • @deceze 我认为 PHP 检查字符串是否为空是在 PHP 5.3 中引入的,无论如何我都会将其取出以消除任何混乱。
          【解决方案6】:

          你可以像这样给变量赋值

          $con=false;
          

          【讨论】:

            【解决方案7】:

            在您的第二个示例中,$con 不是布尔值 false,它是 字符串文字 'false'(注意引号),并且 PHP 中的任何非空字符串计算为true.

            要解决这个问题,只需去掉引号:

            $con=false; // no quotes!
            if($con){echo 'true';} else{echo 'false';} 
            

            【讨论】:

              【解决方案8】:

              您的 $con 声明是一个字符串而不是布尔值。所以它总是会返回true。 要声明布尔值,请使用:

              $con=FALSE;  //or TRUE
              

              【讨论】:

                【解决方案9】:

                'false'false 不同。

                if('true')if('false') 将始终生成 true,因为它们将被视为 strings 并将被转换以进行比较。

                $con=false;
                if($con){echo 'true';} else{echo 'false';} 
                

                将打印false

                【讨论】:

                  【解决方案10】:

                  把你的变量的值改成这个

                     $con = false;    
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-04-03
                    • 1970-01-01
                    • 2013-12-25
                    • 1970-01-01
                    • 2014-09-04
                    • 2021-09-28
                    • 2018-08-23
                    • 1970-01-01
                    相关资源
                    最近更新 更多