2011-02-03 15 views
5

私は、Zend Frameworkのプロジェクトのデフォルトのindex.phpファイルにこの興味深いラインに出くわした:それは言っているように見える「APPLICATION_PATHが定義されていない場合は、上に行くと、それを定義...」興味深いPHP構文: 'implied if'?

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

私はこの制御構造をPHPで認識していません。それは「暗黙のif」や「if/else」のようなものです。誰かがこれで私を助けることができますか?

答えて

16

これは制御構造ではなく、ちょうど||の仕組みです。最初のオペランドがtrueと評価された場合、2番目のオペランドはまったく評価されません。

http://php.net/manual/en/language.operators.logical.php ---サンプルの最初の4行を見てください。

// -------------------- 
// 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

逆に、最初の式がfalseの場合のみ、2番目の式が評価されます。 –

+2

@Surreal Dreams:明らかに - はい;-) – zerkms

+0

+1良い! [Wikipedia](http://en.wikipedia.org/wiki/Short-circuit_evaluation)でさらに読む。 – alex

2

技術的には、これは評価されても結果を捨てるブール式です。それは短絡ロジックを使用して、前半が偽である場合にのみ後半が実行されることを保証します。

同様に、あなたは結果をキャプチャすることができます。

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

そして、常に美しい三項演算子があります: '$ action =(defined( 'APPLICATION_PATH'))? 'default':define( 'APPLICATION_PATH'、realpath(ディレクトリ名(__ FILE__)。 '/../application')); ' – buley

+0

@editor論理がうまく機能していると読みやすくするためにternaryを使う理由 –

4

||は、短絡オペレータです。左側のオペランドがtrueの場合、の式はとなる必要があります。trueなので、右側のオペランドを評価することはありません。逆の方法で&&を使用できます。左オペランドがfalseの場合、全体としての式はfalseである必要があります。したがって、右辺のオペランドは評価されません。

これは他の言語ではややこしいことです。私は通常この場合は明示的にifをPHPで好むでしょう。