operator - El comportamiento del operador o en PHP
php operador logico or (4)
Estoy tratando de entender el comportamiento de or
operador. Por favor vea los ejemplos a continuación:
$e = false || true;
var_dump($e);
La salida es como se esperaba: bool(true);
$f = false or true;
var_dump($f);
La salida es como se esperaba: bool(false)
. Entendí esto de una manera que el =
tiene una precedencia más alta que el Or
, así que es por eso que $f
se asigna a false
.
Pero el siguiente código funciona bastante diferente de lo que pensaba. Pensé que $foo
se asignaría a 5
y luego se compararía a sí mismo. Pero el $foo
se asigna solo cuando se establece $foo
lo que significa que está comprobando si el $foo
está asignado a algo antes, asígnele 5.
$foo or $foo = 5;
¿Alguien puede explicar por qué esto es así?
De acuerdo con la página web php.net sobre operadores lógicos :
Esta:
$e = false || true;
Actúa así:
$e = (false || true) // If false is true, then $e = false. Otherwise true
Esta:
$f = false or true;
Actuaría así:
($f = false) or true; // $f = false is true, as the assignment succeeded
Esta:
$foo or $foo = 5;
Actuaría así:
$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5
Para el último, indefinido es básicamente falso, por lo tanto, foo es igual a 5.
Además, aquí está el enlace para el orden de precedencia del operador: http://www.php.net/manual/en/language.operators.precedence.php
ACTUALIZAR:
Bien, ahora vayamos al punto principal. Como todos sabemos al usar una consulta captada:
while($row = @mysql_fetch_assoc($result))
Y todos sabemos que los bucles solo se ejecutan en true
, por lo tanto $row = @mysql_fetch_assoc($result)
devuelve true.
Lo mismo con la pregunta de Daric.
$foo or $foo = 5;
Es básicamente:
$foo or ($foo = 5);
Que es básicamente:
$foo = undefined or ($foo = 5); // $foo = 5 actually returns true
Cual es también
$foo = undefined or true;
Y como he mencionado anteriormente, undefined = false, entonces $ foo = 5 (ya que esa es la declaración verdadera).
Espero que todos puedan entender.
Los basicos:
Una expresión de asignación da como resultado el valor asignado.
Qué significa eso?
$foo = ''bar''
es una expresión en la que el operador de asignación=
asigna un valor. Una expresión siempre devuelve un valor en sí mismo. Al igual que la expresión1 + 2
da como resultado el valor3
, la expresión$foo = ''bar''
da como resultado el valor''bar''
. Es por eso que esto funciona:$foo = $bar = ''baz''; // which is: $foo = ($bar = ''baz'');
Las operaciones booleanas son operaciones de cortocircuito. Ambas partes no siempre se evalúan si no es necesario.
true || false
true || false
es siempretrue
general, ya que el operando de la izquierda estrue
, por lo que toda la expresión debe sertrue
.false
ni siquiera está siendo evaluado aquí.La precedencia del operador dicta en qué orden las partes de una expresión se agrupan en subexpresiones. Los operadores de mayor precedencia se agrupan con sus operandos antes que los operadores de menor precedencia.
Por lo tanto:
$e = false || true;
false || true
false || true
se está evaluando, lo que da como resultado el valor true
, que se asigna a $e
. El ||
el operador tiene una precedencia mayor que =
, por lo tanto false || true
false || true
se agrupa en una expresión (a diferencia de ($e = false) || true
).
$f = false or true;
Aquí ahora or
tiene una precedencia menor que =
, lo que significa que la operación de asignación se agrupa en una expresión antes or
. Entonces, primero se evalúa la expresión $f = false
, cuyo resultado es false
(ver arriba). Entonces tiene la expresión simple false or true
que se evalúa a continuación y da como resultado true
, pero que a nadie le importa.
La evaluación funciona así:
1. $f = false or true;
2. ($f = false) or true; // precedence grouping
3. false or true; // evaluation of left side ($f is now false)
4. true; // result
Ahora:
$foo or $foo = 5;
Aquí, de nuevo, $foo = 5
tiene una precedencia más alta y se trata como una expresión. Como ocurre en el lado derecho del operador or
, la expresión solo se evalúa si es necesario. Depende de qué $foo
sea inicialmente. Si $foo
es true
, el lado derecho no se evaluará en absoluto, ya que true or ($foo = 5)
debe ser true
general. Sin embargo, si $foo
tiene un valor de falsey inicialmente, se evalúa el lado derecho y 5
se asigna a $foo
, lo que da como resultado 5
, que es verdadero, lo que significa que la expresión general es true
, lo que a nadie le importa.
1. $foo or $foo = 5;
2. $foo or ($foo = 5); // precedence grouping
3. false or ($foo = 5); // evaluation of left side
4. false or 5; // evaluation of right side ($foo is now 5)
5. true; // result
$foo or $foo = 5;
Suppose let say $foo=true or $foo=5;
aquí no se evaluará después de la expresión del operador por lo que la salida será $ foo = 1 Ahora la expresión es
$foo=false or $foo=5;
Aquí evaluará después o como = mayor precedencia así que $foo
partir de cuál de los cuales evaluará $foo=5
así que la salida será 5
Pero cuando evaluamos $foo=false or true
así que aquí considerará = precedencia más alta para que el el resultado será $foo=false
pero la expresión completa se evaluará como verdadera porque false or true
vuelve false
<?php
$foo = false;
$foo or ($foo = ''5'');
echo $foo;
?>
Compruebe esto, puede asignar el valor "5" para $foo
.
Comparar que or
=
tiene alta prioridad ... Eso es el hecho ... :)