我无法理解为什么显示最后一个调试条消息。奇怪的是$nest = 1
,而不是true
。
$nest = true;
$showcosts = false;
Debugbar::info($nest);
Debugbar::info($showcosts);
Debugbar::info("x" . $nest . "x");
Debugbar::info("x" . $showcosts . "x");
Debugbar::info($nest == true);
Debugbar::info($showcosts);
if ($showcosts && $nest) {
Debugbar::info("this should never show");
}
返回:
true
false
x1x
xfalsex
true
false
this should never show
我希望最后一个调试条消息不显示,因为if
语句中只有一个条件是true
。
我正在使用Laravel 5.4和PHP 7。
答案 0 :(得分:2)
如上述评论所述:
布尔值true
的字符串值为1
,这就是连接字符串时得到x1x
的原因。但是,false的字符串值应该是空字符串而不是字符串false
,这意味着您还应该看到xx
输出(不是xfalsex
)。
100%确定$ showcosts是布尔值而不是包含单词false的字符串,因为该行为与检查false
字符串一致。
此外,正如@NinoŠkopac指出的那样,简单的if ($variable)
检查对于被认为是“真实”的$variable
的任何值都是正确的。这包括非空对象,非空数组,非零数字和非空字符串以及布尔true
。在这种情况下,字符串"false"
是非空字符串,因此是“truthy”值。
如果您从请求查询字符串或帖子中获取值(例如,通过$_POST
或$_GET
),则必须记住所有值都是字符串。
为此,PHP有一组过滤功能,旨在帮助解决这个问题。有here和filter_var
(以及其他人,请查看手册了解更多详情)。
您可以对任何变量使用filter_var
,例如您可以这样做:
$nest = filter_var($nest,FILTER_VALIDATE_BOOLEAN);
$showcosts = filter_var($showcosts ,FILTER_VALIDATE_BOOLEAN);
filter_input
过滤器:
为“1”,“true”,“on”和“yes”返回TRUE。否则返回FALSE。
您还可以使用filter_input
直接过滤输入。
例如,如果您有输入条目$_POST["nest"]
,则可以执行以下操作:
filter_input(INPUT_POST,"nest",FILTER_VALIDATE_BOOLEAN);
这也可以让您免于isset
检查。