2010-08-05 9 views
7

PHP's or es una palabra clave extraña. Aquí está en un fragmento de código que me hace confundir:Las formas extrañas de "o" en PHP

echo 0 or 1; // prints 1 

$foo = (0 or 1); 
echo $foo; // prints 1 

$foo = 0 or 1; 
echo $foo; // prints 0 for some reason 

¿Por qué la última impresión 0 y no 1?

+0

¿La gente realmente escribe la palabra "o" en lugar de dos tubos? – Incognito

+1

Claro.Las palabras (como "o") generalmente tienen más sentido para las personas que las combinaciones de símbolos raros (como "||"). –

Respuesta

21

Esto se debe a la diferente operador con precedencia. En el tercer caso, la tarea se maneja primero. Será interpretado como esto:

($foo = 0) or 1; 

El operador || tiene una prioridad diferente. Si usa

$foo = 0 ||1; 

Funcionará como esperaba.

Véase el manual on logical operators

+0

Lo habría escrito como '$ foo = (0 o 1);' – Treffynnon

+0

@Trefynnon: No, 'o' tiene una prioridad menor que' = '. Si tuviera que usar '||', estaría en lo cierto. – nico

+0

@Treffynnon: Pero esa sería una declaración diferente. – You

4

Es ($foo = 0) or 1;. or tiene un menor operator precedence que =.

En este caso, debe usar ||, ya que tiene una precedencia mayor que =, y por lo tanto lo evaluará como era de esperar.

5

No, no quiero, eso es debido a operator precedence:

$foo = 0 or 1; 
// is same as 
($foo = 0) or 1; 
// because or has lower precedence than = 

$foo = 0 || 1; 
// is same as 
$foo = (0 || 1); 
// because || has higher precedence than = 

// where is this useful? here: 
$result = mysql_query() or die(mysql_error()); 
// displays error on failed mysql_query. 
// I don't like it, but it's okay for debugging whilst development. 
0

IIRC, el operador de asignación (=) tiene mayor prioridad que or. Por lo tanto, la última línea sería interpretado como:

($foo = 0) or 1; 

que es una declaración que asigna 0-$foo, pero devuelve 1. La declaración puño se interpreta como:

echo(0 or 1); 

Un tal como se imprimirá 1.

0

Orden de las operaciones. La palabra "o" tiene una precedencia mucho menor que la correspondiente "||". Menor, incluso, que el operador de asignación. Entonces, la asignación ocurre primero, y el valor de la asignación es el primer operando al "o".

"o" está destinado más a ser utilizado para el control de flujo que para operaciones lógicas. Le permite decir algo como

$x = get_something() or die("Couldn't do it!"); 

si get_something se codifica para volver falsa o 0 en caso de fallo.

0

En los primeros dos fragmentos, está comparando 0 o 1 (esencialmente verdadero o falso). En el tercer fragmento está asignando 0, que funciona, y por lo tanto es verdadero, por lo tanto, la condición o no se ejecuta. texto enfatizado

0

En su tercer ejemplo, el operador = tiene una precedencia mayor que o, y por lo tanto se hace primero. El || el operador, superficialmente el mismo, tiene una precedencia mayor que =. Como dices, interesante.

Cuestiones relacionadas