web-dev-qa-db-ja.com

PHPに短絡評価がありますか?

次のコードを考えます:

_if (is_valid($string) && up_to_length($string) && file_exists($file)) 
{
    ......
}
_

is_valid($string)falseを返す場合、PHPインタープリターはup_to_length($string)のような後の条件を引き続きチェックしますか?
もしそうなら、必要がないのになぜ余分な仕事をするのですか

65
Muntasir

はい、PHPインタープリターは「遅延」です。つまり、条件を評価するために可能な限り最小限の比較を行います。

それを確認したい場合は、これを試してください:

function saySomething()
{
    echo 'hi!';
    return true;
}

if (false && saySomething())
{
    echo 'statement evaluated to true';
}
92
Zach Rattner

はい、そうです。短絡評価に依存する小さなトリックを次に示します。時々、3進数として書きたいという小さなif文があるかもしれません:

_    if ($confirmed) {
        $answer = 'Yes';
    } else {
        $answer = 'No';
    }
_

次のように書き換えることができます。

_   $answer = $confirmed ? 'Yes' : 'No';
_

しかし、yesブロックでも何らかの関数を実行する必要がある場合はどうでしょうか?

_    if ($confirmed) {
        do_something();

        $answer = 'Yes';
    } else {
        $answer = 'No';
    }
_

さて、短絡評価のため、3項としての書き換えは依然として可能です。

_    $answer = $confirmed && (do_something() || true) ? 'Yes' : 'No';
_

この場合、式(do_something()|| true)は、3項の全体的な結果を変更することはありませんが、3項の条件がtrueのままで、do_something()の戻り値を無視します。 。

8
Robert

いいえ、最初の条件が満たされない場合、他の条件はもうチェックしません。

2
Obay

ビット演算子&および|。常に両方のオペランドを評価します。

論理演算子ANDOR&&、および||

  • 4つの演算子はすべて、必要な場合にのみ右側を評価します。
  • ANDORの優先順位は&&および||。以下の例を参照してください。

PHPマニュアルから:

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f before the "or" operation occurs
// Acts like: (($f = false) or true)
$f = false or true;

この例では、etrueになり、ffalseになります。

1
Steve Douglas

今の私の調査に基づいて、PHPは同じ&& JavaScriptとしての短絡演算子。

私はこのテストを実行しました:

$one = true;

$two = 'Cabbage';

$test = $one && $two;

echo $test;

およびPHP 7.0.8が返された1Cabbageではありません。

0
agm1984

私は独自の短絡評価ロジックを作成しましたが、残念なことにjavascriptsのクイック構文とはまったく異なりますが、おそらくこれは役に立つと思われるソリューションです。

$short_circuit_isset = function($var, $default_value = NULL) {
    return  (isset($var)) ? : $default_value;
};

$return_title = $short_circuit_isset( $_GET['returntitle'], 'God');

// Should return type 'String' value 'God', if get param is not set

私は次のロジックをどこから得たのか思い出せませんが、あなたが次のことをすれば;

(isset($var)) ? : $default_value;

疑問符の後に、真の条件変数を再度書き込む必要をスキップできます。例:

(isset($super_long_var_name)) ? $super_long_var_name : $default_value;

非常に重要な観察として三項演算子をこの方法で使用すると、比較が行われた場合、 1つの変数だけではないため、その比較の値を渡すだけです。例えば:

$num = 1;
$num2 = 2;
var_dump( ($num < $num2) ? : 'oh snap' );
// outputs bool 'true'
0
Perspective