类型转换为布尔值

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?

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

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.

I use this way:

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

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.