PHP operator precedence
The "AND" and "&&" operators seem to be identical, but they have a different precedence. And the same applies to the "OR" and "||" operators:
$result = false || true; // yields "true"
$result = false or true; // yields "false"
Written by Bela Patkai
Related protips
3 Responses
Pretty clever:
http://codepad.org/UxoUp1E9
This sounds like a clear bug (and another reason to never use 'or' in PHP). Per documentation 'or' should yield 'true' when it's $result = false or true;
:
"$a or $b Or TRUE if either $a or $b is TRUE"
From the documentation http://php.net/manual/en/language.operators.logical.php, is pretty clear how or
and and
work.
Operators like ||
and &&
will make the logical comparison between two boolean values.
$a = false || true; // a => true
is equal to:
$a = (false || true); // a => true
But or
and and
will make a decision in the flow of the program. The or
operator will run the second part of the expression only in the first one has failed. For instance:
connect_to_my_db() or die('Nope!');
That's the most common usage for the or
operator. But, when we use it for something like this:
$a = false or true; // a => false
This is the wrong way to use this kind of operator. What happens here is that, PHP will try to identify two expressions and it will do it. The first expression is $a = false
and the second one is true
. Then will consider that the assignment was successful and will not use the second part of the or
operation.
So, the equivalent for the previous line of PHP is:
($a = false) or true; // $a => false
The same thing for the and
operator, but it'll examine the second part of the operation only in the first one was successful. For example, you can do something like this:
open_my_file() and read_my_file();
Only if the opening of the file has succeeded then it'll read the content of the file.
Is this confusing? Maybe yes. So, this is not a bug, but we're using the language in the wrong way.