在PHP中比较布尔真值和整数值

在PHP中比较布尔真值和整数值,php,integer,boolean,comparison,Php,Integer,Boolean,Comparison,我有以下PHP,服务器在脚本中运行版本5.3.x,这给了我一个我很难理解的结果。这段代码的基本思想是我有一个正常模式和两个维护模式。在第一种维护模式中,数据只被评估,管理员可以查看,但不会存储到数据库中。如果我将$maintenance\u mode\u enabled设置为2;,然后应显示相同的预览输出,但只应处理对数据库的某些特定更新。我添加==2比较的原因是,在为基本默认维护模式设置了true/false之后,我发现需要第三个选项。无论如何,我注意到我上次维护时有18条记录_mode_en

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

我得到的结果是:

Case 0
Case 2
据我所知,真正的布尔值绝对不等于3。在比较false、NULL和0时,我熟悉一些奇怪的情况,但是整数和TRUE的这个问题对我来说是全新的

你知道为什么这不起作用吗?我意识到我可以同样轻松地将$maintenance\u mode\u enabled更改为整数,而不是默认的bolean,并将其设置为0、1或2以获得所需的结果,但我真的想理解为什么这似乎违反逻辑。

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

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

下面将输出案例0

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

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

下面将输出案例0


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

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

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

正如前面的回答提到的,我将更改代码以使用严格比较。我还将从三个独立的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";
}
我建议进行此更改,因为维护模式只能有一个值

编辑

我不知道真的和2可以共存。你可以做:

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

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

正如前面的回答提到的,我将更改代码以使用严格比较。我还将从三个独立的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";
}
我建议进行此更改,因为维护模式只能有一个值

编辑

我不知道真的和2可以共存。你可以做:

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

检查此项您可能想了解更多信息,请检查。我个人将此链接作为书签,因为PHP的奇怪之处通常不是很明显。检查此链接,您可能想了解更多信息,请查看。我个人将此链接标记为书签,因为PHP的奇怪之处通常不是很明显。代码中的问题是$maintenance\u mode\u enabled=true仍然会导致输出案例2。这里的问题是类型转换或类型杂耍,这是我在重新检查PHP文档时意识到的:您是正确的。我修复了输出案例0的逻辑。代码中的问题是$maintenance\u mode\u enabled=true仍然会导致输出案例2。这里的问题是类型转换或类型杂耍,这是我在重新检查PHP文档时意识到的:您是正确的。我将逻辑固定为输出情况0,并且利用elseif树也是一个选项。特别是在将状态变量用于三个不同的目的时,它有助于澄清隐含的逻辑。@mario-true,尽管出于我的目的,这是过分的
锿。只需在我的案例2比较中添加第三个=就足够了。而利用埃尔塞夫树也是一种选择。特别是在将状态变量用于三个不同的目的时,它有助于澄清隐含的逻辑。@mario-true,尽管这对于我来说太过分了。只需在我的案例2比较中添加第三个=就足够了。对于您的代码,如果$maintenance\u mode\u enabled设置为2,那么案例0不会被打印出来吗?我希望常规维护模式显示在不更新任何内容的情况下更新的内容案例0,以及仅进行少量更新案例2维护模式在$maintenance\u mode\u enabled为2时运行。我更新的答案是否足够?如果是这样的话,你能让我的回答正确吗?独立的If语句需要保持独立,因为它们在整个脚本中都做不同的事情。不过,您关于comarison功能的技术回答是正确的,因此我对您进行了投票。对于您的代码,如果$maintenance\u mode\u enabled设置为2,案例0不会被打印出来吗?我希望常规维护模式显示在不更新任何内容的情况下更新的内容案例0,以及仅进行少量更新案例2维护模式在$maintenance\u mode\u enabled为2时运行。我更新的答案是否足够?如果是这样的话,你能让我的回答正确吗?独立的If语句需要保持独立,因为它们在整个脚本中都做不同的事情。不过,你关于comarison功能的技术回答是正确的,所以我投了你一票。