Type-casting to boolean

2020-08-09 05:03发布

Can someone explain me why this:

var_dump((bool) 1==2);

returns

bool(true)

but

var_dump(1==2);

returns

bool(false)

Of course the second return is correct, but why in the first occasion php returns an unexpected value?

4条回答
放荡不羁爱自由
2楼-- · 2020-08-09 05:13

The way you have written the statement ((bool) 1==2) will always return true because it will always execute the code like below flow:

First, it will execute

(bool)1

and (bool) 1 will return true.

Now since (bool)1 is true at second step your statement will be like

true ==2

Since if we will typecast 2 into boolean it will return true, at final state your statement will be like

true == true

Which will obviously return true. The same thing I have explained year back in my post PHP Type casting as well.

查看更多
手持菜刀,她持情操
3楼-- · 2020-08-09 05:31

It's actually not as strange it seems. (bool) has higher precedence than ==, so this:

var_dump((bool) 1==2);

is equivalent to this:

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

or this:

var_dump(true == 2);

Due to type juggling, the 2 also essentially gets cast to bool (since this is a "loose comparison"), so it's equivalent to this:

var_dump(true == true);

or this:

var_dump(true);
查看更多
来,给爷笑一个
4楼-- · 2020-08-09 05:31

I use this way:

!!0 (false)
!!1 (true)
查看更多
啃猪蹄的小仙女
5楼-- · 2020-08-09 05:35

Because in the first example, the cast takes place before the comparison. So it's as if you wrote

((bool) 1)==2

which is equivalent to

true == 2

which is evaluated by converting 2 to true and comparing, ultimately producing true.

To see the expected result you need to add parens to make the order explicit:

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

See it in action.

查看更多
登录 后发表回答