2011-12-05 61 views
37

有人可以解释我为什么这样的:类型转换为布尔

var_dump((bool) 1==2); 

回报

bool(true) 

var_dump(1==2); 

回报

bool(false) 

当然,第二次返回是正确的,但为什么在第一次php返回一个意外的值?

+9

操作顺序让你在这里... – Brad

回答

74

它实际上并不像看起来那么奇怪。 (bool) has higher precedence than ==,所以这样的:

var_dump((bool) 1==2); 

是相同的:

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

或本:

var_dump(true == 2); 

由于type juggling,该2也基本上被转换为bool(因为这是一个“松散的比较”),所以它等同于:

var_dump(true == true); 

或本:

var_dump(true); 
+0

谢谢!非常详细的解释:) –

+0

不客气! – ruakh

+2

...尝试始终使用'===' – xDaizu

19

因为在第一个例子中,演员发生在比较之前。所以,就好像你写

((bool) 1)==2 

这相当于

true == 2 

这是通过转换2true和比较,最终产生true评估。

要见你需要添加括号预期的结果,使顺序明确:

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

See it in action

+1

+1感谢您的快速响应 –

6

我用这样的方式:

!!0 (false) 
!!1 (true) 
+4

正如标题要求输入的那样,这个答案是正确的,几乎可以用于任何语言。这种结构对于像JavaScript这样的语言来说是非常好的,你需要真正的“真”或“假”,但不能保持原始值。顺便说一句,用(bool)进行类型转换要快一点。 –

0

你写的声明((布尔)1 == 2)的方式将永远,因为它会返回true总是执行下面的流程代码:

首先,它会执行

(bool)1 

和(bool)1将返回true。

现在,因为(布尔)1是在第二个步骤真正的语句会像

true ==2 

因为如果我们将强制转换2到布尔它将返回true,在最后的状态你的发言就会像

true == true 

这显然会返回true。 同样的事情,我已经在我的帖子PHP Type casting中解释过。

相关问题