2011-02-03 9 views
5

me encontré con este interesante línea en el archivo index.php predeterminado para un proyecto Zend Framework:Sintaxis interesante de PHP: ¿'implicado si'?

defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

Parece estar diciendo "Si APPLICATION_PATH no se define, a continuación, seguir adelante y definirlo ..."

No conozco esta estructura de control en PHP. Es casi como un 'implicado si' o 'si/otro'. ¿Puede alguien ayudarme con esto?

Respuesta

16

No es una estructura de control, es cómo funciona ||. Si el primer operando se evaluó a true, entonces el segundo no se evalúa en absoluto.

http://php.net/manual/en/language.operators.logical.php --- observe las primeras 4 líneas de la muestra.

// -------------------- 
// foo() will never get called as those operators are short-circuit 

$a = (false && foo()); 
$b = (true || foo()); 
$c = (false and foo()); 
$d = (true or foo()); 
+3

Por el contrario, solo si la primera expresión es falsa, se evalúa la segunda. –

+2

@Surreal Dreams: obviamente, sí ;-) – zerkms

+0

+1 ¡Bien! Lectura adicional en [Wikipedia] (http://en.wikipedia.org/wiki/Short-circuit_evaluation). – alex

2

Técnicamente esto es solo una expresión booleana que se evalúa pero descarta el resultado. Utiliza la lógica de cortocircuito para garantizar que la segunda mitad solo se ejecute cuando la primera mitad sea falsa.

Del mismo modo, puede capturar el resultado:

$foo = false || true; // $foo will contain true. 
+0

Y siempre está el encantador operador ternario: '$ action = (defined ('APPLICATION_PATH'))? 'default': define ('APPLICATION_PATH', realpath (dirname (__ FILE__). '/../application')); ' – buley

+0

@editor por qué usar ternario si lógico funciona bien y es más legible –

4

|| es un operador de cortocircuito. Si el operando de la izquierda es true, la expresión como un todo debe ser true, por lo que no molestará evaluar el operando de la derecha. Puede usar && de manera inversa; si el operando de la izquierda es false, la expresión como un todo debe ser false, por lo que no se evaluará el operando de la derecha.

Esta es una forma bastante idiomática de hacer las cosas en algunos otros idiomas. Por lo general, prefiero un if explícito en PHP, aunque para este caso.