5

私は現在ZENDフレームワークを研究しており、index.phpでこれに出くわしました:

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

これはこれと同じですか?

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

私はこれまで、このタイプの省略形の構文に出くわしたことがありません。

4

7 に答える 7

5

||は短絡演算子です。つまり、2 番目のオペランドは、この場合define(...)、最初のオペランドが false と評価された場合にのみ評価されます。シャツ回路演算子へのオペランドには実際に副作用がある可能性があるため、ショートサーキットはifステートメントに代わる場合があります。

この記事を確認してください: http://en.wikipedia.org/wiki/Short-circuit_evaluation

于 2010-11-10T20:12:39.647 に答える
2

機能的には、はい、同じです。このdefined関数はブール値を返すため、短絡評価を使用して「これが定義されているか、この定義を実行する」ことを意味します。

于 2010-11-10T20:11:52.967 に答える
2

はい。ただし、これは PHP がブール値評価を実装する方法に基づいており、慣用的な構造と見なすべきではありません。PHP の将来のリリースではほぼ確実に機能しますが、表現力に欠けるため、この構文はお勧めできません。

この構文が機能する理由を簡単に説明します。

PHP のブール式の形式は次のとおりです。

left_expression BOOLEAN_OPERATOR right_expression;

たとえば、whereBOOLEAN_OPERATOR論理演算子です。||

OR 式は、オペランドの 1 つが と評価されるとすぐに true と評価されるためtrue、PHP インタープリターは、 と評価されるオペランドを見つけるとすぐに評価を停止できますtrue

この場合、defined('APPLICATION_PATH')true と評価された場合は評価されdefine('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'))ません。が false と評価された場合defined('APPLICATION_PATH')、PHP は を評価する必要がありますdefine('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'))

だからいつでも、

  • 左の式は false と評価され、右の式は評価されます。
  • 左の式は true に評価され、右の式は評価されません。
于 2010-11-10T20:23:19.700 に答える
0

これは短絡と呼ばれます。OR(||)は、最初の部分がfalseの場合にのみ、2番目の部分を評価します。同様に、AND(&&)は、最初の部分が真である場合にのみ2番目の部分を評価するために使用できます。

于 2010-11-10T20:10:44.077 に答える
0

はい。PHPは怠惰であり、論理和またはステートメントがある場合、最初のステートメントがtrueと評価された後に停止します。

于 2010-11-10T20:10:58.023 に答える
0

あなたはその考えを正しく理解しました。PHPのほとんどの命令文は、短絡に使用できるブール値を返します。void(null / falseと同等)を返すものでも同じように使用できます。

于 2010-11-10T20:11:12.757 に答える
0

はい。「or」演算子||は「遅延」評価されることに注意してください。最初の部分が「TRUE」と評価された場合、2 番目の部分は実行されません。これは、その結果がステートメント全体に影響を与えないためです。&& についても同じことが言えます。最初の部分が FALSE の場合、2 番目の部分は実行されません。

于 2010-11-10T20:12:40.680 に答える