2010-11-10 53 views
5

Hola chicos :) Necesito ayuda. estoy estudiando Zend Framework y encontré esto en index.php:¿Es correcta esta sintaxis de PHP?

// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

¿Es esto lo mismo que ?:

if(!defined('APPLICATION_PATH')){ 
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 
} 

nunca he encontré con este tipo de sintaxis abreviada antes ...

+0

Esta es la primera vez que veo esta sintaxis. – Shoe

Respuesta

5

|| es un operador de cortocircuito, lo que significa que el segundo operando, en este caso define(...) solo se evalúa en caso de que el primer operando se evalúe como falso. Debido a que los operandos de los operadores del circuito de camisa pueden tener efectos secundarios como es su caso, un cortocircuito puede sustituir una declaración de if.

Comprobar este artículo: http://en.wikipedia.org/wiki/Short-circuit_evaluation

+0

Creo que quieres decir "en caso de que el primer operando sea' falso' ". De lo contrario, sería '&&' en lugar de '||'. – netcoder

+0

@netcoder: Gracias, estoy corregido. –

+0

@Andre: ¡Bienvenido a stackoverflow! No es inusual obtener muchas respuestas rápidamente ya que todos nosotros aquí compiten por la reputación :-) –

0

Se llama cortocircuito. O (||) solo evaluará la segunda parte si la primera parte es falsa. De forma similar, AND (&&) se puede usar para evaluar solo la segunda parte si la primera parte es verdadera.

0

Sí. PHP es flojo y si hay una declaración lógica o, se detendrá después de que la primera evalúe verdadero.

0

Has tenido la idea correcta. La mayoría de las declaraciones imperativas en PHP devuelven booleanos que pueden usarse para cortocircuitar. Incluso aquellos que devuelven el vacío (equivalente a nulo/falso) se pueden usar de la misma manera.

2

Funcionalmente, sí, es lo mismo. La función defined devuelve un valor booleano, por lo que utiliza la evaluación de cortocircuito para indicar "o bien está definido, O ejecuta esta definición".

0

Sí. Recuerde que el operador "o" || se evalúa "Perezosamente" - si la primera parte se evalúa como "VERDADERO", la segunda parte no se ejecuta, porque su resultado no tendrá ningún efecto en la declaración en general. Lo mismo ocurre con & & - si la primera parte es FALSA, la segunda no se ejecutará.

2

Sí. Sin embargo, está basado en the way PHP implements boolean evaluation y no debe considerarse una construcción idiomática. Es casi seguro que funcionará en futuras versiones de PHP, pero aún así desalentaría esta sintaxis ya que carece de expresividad.

He aquí una breve explicación sobre por qué funciona esta sintaxis:

expresiones booleanas en PHP tienen la forma:

left_expression BOOLEAN_OPERATOR right_expression;

donde BOOLEAN_OPERATOR es una logical operator, || por ejemplo.

Dado que las expresiones OR se evalúan como verdaderas tan pronto como uno de sus operandos evalúe como true, el intérprete PHP puede dejar de evaluar tan pronto como encuentre un operando que evalúe como true.

En este caso si defined('APPLICATION_PATH') se evalúa como verdadero, define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')) no será evaluado. Si defined('APPLICATION_PATH') se evalúa como falso, PHP debe evaluar define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')).

Así que cuando,

  • la expresión se evalúa como falsa izquierda, se evalúa la derecha.
  • la expresión izquierda se evalúa como verdadera, la derecha no se evalúa.
+0

No puedo estar de acuerdo con que dicho modismo carece de expresividad. Es este tipo de expresiones que hacen de Perl un lenguaje tan flexible y expresivo. –

Cuestiones relacionadas