Type-casting to boolean

2020-08-09 05:24发布

问题:

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?

回答1:

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);


回答2:

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.



回答3:

I use this way:

!!0 (false)
!!1 (true)


回答4:

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.