如果2个布尔都是真的

时间:2017-10-05 20:23:43

标签: php if-statement boolean

我无法理解为什么显示最后一个调试条消息。奇怪的是$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。

1 个答案:

答案 0 :(得分:2)

如上述评论所述:
布尔值true的字符串值为1,这就是连接字符串时得到x1x的原因。但是,false的字符串值应该是空字符串而不是字符串false,这意味着您还应该看到xx输出(不是xfalsex)。

100%确定$ showcosts是布尔值而不是包含单词false的字符串,因为该行为与检查false字符串一致。

此外,正如@NinoŠkopac指出的那样,简单的if ($variable)检查对于被认为是“真实”的$variable的任何值都是正确的。这包括非空对象,非空数组,非零数字和非空字符串以及布尔true。在这种情况下,字符串"false"是非空字符串,因此是“truthy”值。

如果您从请求查询字符串或帖子中获取值(例如,通过$_POST$_GET),则必须记住所有值都是字符串。

为此,PHP有一组过滤功能,旨在帮助解决这个问题。有herefilter_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检查。