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?
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.