我在脚本中有以下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以获得所需的结果,但我真的想了解为什么这似乎是无视逻辑。
答案 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";
}
我建议您进行此更改,因为维护模式只能有一个值。
修改强>
我没有意识到true
和2
可以共存。你可以这样做:
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是不同类型的 - 布尔值。