La clave está en la línea que citó
abimaelrc.
Código PHP:
$foo = false OR $true;
Resulta que el operador lógico || no funciona de la misma manera que OR. Ciertamente el primero tiene mayor prioridad que el segundo.
Esto se ve más claro en el siguiente ejemplo:
Uso del operador || Código PHP:
$foo = false || true;
var_dump($foo); // true
// Es equivalente a:
$foo = ( false || true );
var_dump($foo); // true
Como es lógico, la expresión (false || true) devuelve true, ya que basta que uno de los dos sea verdadero.
Uso del operador OR Código PHP:
$foo = false OR true;
var_dump($foo); // false
// Es equivalente a:
( $foo = false ) OR true;
var_dump($foo); // false
En este segundo caso, ya que OR tiene menor importancia, primero se asigna "false" a $foo, y el resultado de esta expresión pues es el mismo valor, osea, false. Luego, recién se opera con la segunda expresión (luego del OR) que sería true. El resultado de toda esta expresión sería true, pero $foo no recibe este valor final, ya que es evaluado al inicio. De hecho, nadie lo toma, pero se puede comprobar de la siguiente forma:
Código PHP:
// $foo = false OR true == false OR true == true
var_dump( $foo = false OR true ); //true
En resumen. El comportamiento es el correcto al usar el operador OR. Si usáramos el operador || obtendríamos el resultado "esperado"