将PHP中的BOOLEAN TRUE与INTEGER值进行比较

时间:2014-08-19 03:44:39

标签: php integer boolean comparison

我在脚本中有以下PHP(服务器运行的是5.3.x版本),这给了我一个我无法理解的结果。这段代码的一般概念是我有一个“正常模式”和两种维护模式。在第一种维护模式中,仅评估数据,管理员可以查看数据,但不会将数据存储到数据库中。如果我设置$maintenance_mode_enabled = 2;,则应显示相同的“预览”输出,但只应处理对数据库的某些特定更新。我添加==2比较的原因是因为我在为基本默认维护模式设置了true / false后发现需要第三个选项。无论如何,我注意到在我上一次maintenance_mode_enabled = true;运行中有18条记录在过程中被部分更新,就像我设置了maintenance_mode_enabled = 2;一样。

        $maintenance_mode_enabled = true;

        if ($maintenance_mode_enabled){
            echo "Case 0\n";
        }

        if (!$maintenance_mode_enabled){
            echo "Case 1\n";
        }

        if ($maintenance_mode_enabled == 2){
            echo "Case 2\n";
        }

我得到的输出是:

Case 0
Case 2

根据我的理解,true(布尔值)绝对不等于3.我在比较false,NULL和0时熟悉一些奇怪的东西,但这个整数和TRUE的问题对我来说是全新的。

关于为什么这不起作用的任何想法?我意识到我可以很容易地将$maintenance_mode_enabled更改为整数而不是默认的bolean,并将其设置为0,1或2以获得所需的结果,但我真的想了解为什么这似乎是无视逻辑。

3 个答案:

答案 0 :(得分:4)

发生这种情况的原因是因为您要将布尔值与整数进行比较。与许多语言一样,在比较函数的核心,它将比较的第二部分转换为布尔值。任何非NULL,非零,非空或非假值,在这种情况下2是" true。"

正如之前的回答所提到的,我会更改代码以使用严格的比较。我还将从三个单独的if语句更改为一个if-elseif语句:

if ($maintenance_mode_enabled === true) {
    // catches only true not > 0
    echo "Case 0\n";
} elseif ($maintenance_mode_enabled === false) {
    // catches only true not = 0
    echo "Case 1\n";
} elseif ((int)$maintenance_mode_enabled === 2) {
    echo "Case 2\n";
}

我建议您进行此更改,因为维护模式只能有一个值。

修改

我没有意识到true2可以共存。你可以这样做:

if ($maintenance_mode_enabled) {
    echo "Case 0\n";
    if (2 === (int)$maintenance_mode_enabled) {
        echo "Case 2\n";
    }
} else {
    echo "Case 1\n";
}

答案 1 :(得分:0)

===使用true运算符,否则所有非0 / null / false将为true

===使用false运算符,否则所有等于0 / false / null的行将显示为" false"

以下内容将输出Case 0

<?php 
 $maintenance_mode_enabled = true;
 if ($maintenance_mode_enabled === true){
        // catches only true not just > 0
        echo "Case 0\n";
    }

    elseif (!$maintenance_mode_enabled === false){
        // catches only false not including = 0
        echo "Case 1\n";
    }
    elseif ($maintenance_mode_enabled == 2){
        echo "Case 2\n";
    }

?>

答案 2 :(得分:0)

哦,现在我明白了。这里的问题似乎是当我对布尔值与整数进行松散(==)比较时,类型转换将整数转换为布尔值,从而导致2等于true - 因为两者都是被测试为布尔值。解决方案是使用严格(===)比较,因此两者必须是相同的类型...即:2(整数),与true完全相同,因为true是不同类型的 - 布尔值。