类型转换为布尔值

48

有人能解释一下这个代码为什么会这样吗:

var_dump((bool) 1==2);

返回

bool(true)
但是。
var_dump(1==2);

返回值

bool(false)

当然第二个返回值是正确的,但为什么在第一种情况下php会返回一个意外的值呢?


12
运算优先级导致了你出现这种情况... - Brad
5个回答

97

其实它并不像看起来那么奇怪。(bool)==的优先级更高,所以这样:

var_dump((bool) 1==2);

等同于这个:

var_dump(  ((bool) 1)   == 2);

或者这样:

var_dump(true == 2);

由于类型转换2也基本上被强制转换为bool(因为这是一种“松散比较”),所以它相当于这样:

var_dump(true == true);
或者这样:
var_dump(true);

4
始终使用 === 的另一个原因。 - xDaizu
1
@xDaizu 这与使用===没有任何关系。以下语句返回false,如果你不理解运算符优先级的话,仍然会感到意外: (bool) 1===1 只要根据给定情况选择适当的==和===即可,不要仅仅基于一些“总是这样做”的规则。 - dougd_in_nc
1
@ruakh 关于这个问题,我并不觉得表达式1==2有什么困惑的地方,而且我知道很多情况下==运算符都能很好地工作。再次强调,==和===之间的区别与解决给定问题无关。类型转换与OP提出的问题毫无关系,这只会混淆一个独立的问题。 - dougd_in_nc
1
OP代码中有var_dump((bool) 1==2); 这相当于true == 2,因为运算符优先级的原因。就像((bool) 1===1)等同于(true === 1)...即使使用===,这也显然不是很明显。此外,true==2对我来说并不难理解,并且对某些应用程序来说非常合理。但是,如果有人不太了解==的用法,那么我可以理解他们为什么想始终使用===。所以,各取所需。 - dougd_in_nc
1
@DanielWu 是的,你找到了将表达式转换为false的众多方法之一。发帖者并不是在问“我怎样才能使这个表达式返回false。”如果发帖者只是想找到一个获得false的方法,我相信他们可以自己做到。 - dougd_in_nc
显示剩余3条评论

21

因为在第一个示例中,强制转换发生在比较之前。所以这就好像你写了:

((bool) 1)==2

等价于

true == 2

2 转换为 true 并进行比较,最终产生了 true 的求值结果。

为了看到预期的结果,您需要添加括号以明确顺序:

var_dump((bool)(1==2));

点此查看示例.


7
我使用这种方法:
!!0 (false)
!!1 (true)

5
由于标题要求进行类型转换,因此这个答案是正确的,几乎可以用于任何语言。这种结构对于像JavaScript这样需要真正的“true”或“false”,但不需要保留原始值的语言非常有用。顺便说一句,使用(bool)进行类型转换会稍微快一些。 - Markus Zeller

2

filter_var - 通过具体的过滤器对变量进行过滤

$boolvar = filter_var('true', FILTER_VALIDATE_BOOLEAN);

boolval - 获取变量的布尔值 PHP 5 >=

$boolvar = boolval ('true');

实际上可以使用三目运算符进行操作,但我不建议这样做。

$boolvar = ($string === 'true')  ? true: false; 

0
你写的语句 ((bool) 1==2) 的方式总是会返回 true,因为它将始终按照以下流程执行代码:

首先,它将执行

(bool)1

而且 (bool) 1 将返回 true。

现在,由于 (bool) 1 在第二步是 true,因此您的语句将变成

true ==2

由于如果我们将2强制转换为布尔值,它将返回true,在最终状态下,您的语句将如下所示

true == true

这显然会返回 true。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接