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"
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;:
$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.
$a = false
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.