2010-11-10 15 views
5

Hey ragazzi :) Ho bisogno di aiuto. Attualmente sto studiando Zend Framework e scovato questo in index.php:questa sintassi PHP è corretta?

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

È questo lo stesso ?:

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

mi sono mai imbattuto in questo tipo di sintassi abbreviata prima ...

+0

Questa è la prima volta che vedo questa sintassi. – Shoe

risposta

5

|| è un operatore di cortocircuito, il che significa che il secondo operando, in questo caso define(...) viene valutato solo nel caso in cui il primo operando venga valutato su falso. Poiché gli operandi agli operatori di camicie a circuito chiuso possono effettivamente avere effetti collaterali come nel tuo caso, il cortocircuito può sostituire un'istruzione if.

Controllare questo articolo: http://en.wikipedia.org/wiki/Short-circuit_evaluation

+0

Penso che tu intenda "nel caso in cui il primo operando sia' falso' ". Altrimenti, sarebbe '&&' invece di '||'. – netcoder

+0

@netcoder: Grazie, sono corretto. –

+0

@Andre: Benvenuto in StackOverflow! Non è insolito ricevere rapidamente molte risposte, dato che tutti noi qui siamo in competizione per la reputazione :-) –

0

Si chiama cortocircuito. O (||) valuterà solo la seconda parte se la prima parte è falsa. Allo stesso modo, AND (&&) può essere utilizzato per valutare solo la seconda parte se la prima parte è vera.

0

Sì. PHP è pigro e se c'è una logica o un'istruzione, si fermerà dopo che il primo è vero.

0

Hai avuto l'idea giusta. La maggior parte delle dichiarazioni imperative in PHP restituiscono booleani che possono essere utilizzati per cortocircuiti. Anche quelli che restituiscono il nulla (equivalente a null/falso) possono essere utilizzati allo stesso modo.

2

Funzionalmente, sì, è lo stesso. La funzione defined restituisce un valore booleano, quindi utilizza la valutazione di cortocircuito per indicare "o questo è definito, OPPURE eseguire questa definizione."

0

Sì. Ricordare che l'operatore "o" || viene valutato "Lazily" - se la prima parte restituisce "TRUE", la seconda parte non viene eseguita, poiché il risultato non avrebbe alcun effetto sull'istruzione in generale. La stessa cosa vale per & & - se la prima parte è FALSE, il secondo non verrà eseguito.

2

Sì. Tuttavia, si basa su the way PHP implements boolean evaluation e non deve essere considerato un costrutto idiomatico. Funzionerà quasi sicuramente nelle versioni future di PHP, ma vorrei ancora scoraggiare questa sintassi in quanto manca di espressività.

Ecco una breve spiegazione sul perché questa sintassi funziona:

espressioni booleane in PHP hanno la forma:

left_expression BOOLEAN_OPERATOR right_expression;

dove BOOLEAN_OPERATOR è un logical operator, || per esempio.

Poiché le espressioni OR vengono valutate su true non appena uno dei loro operandi viene valutato su true, l'interprete PHP può interrompere la valutazione non appena trova un operando che valuta true.

In questo caso, serestituisce true, define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')) non verrà valutato. Se defined('APPLICATION_PATH') restituisce false, PHP deve valutare define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')).

Così ogni volta,

  • l'espressione di sinistra è falsa, il diritto viene valutata.
  • l'espressione di sinistra restituisce true, il diritto non viene valutato.
+0

Non posso essere d'accordo sul fatto che un tale idioma manchi di espressività. È questo tipo di idiomi che rendono Perl un linguaggio così flessibile ed espressivo. –

Problemi correlati