6

私は(少なくとも私の定義では)少し最適化フリークであり、この質問はかなり長い間私を悩ませてきました。

PHPが&&と||を最適化するかどうか疑問に思っています。次の例を見てください。

$a = "apple";
$b = "orange";
if ($a == "orange" && $b == "orange") {
    //do stuff
}

そのコードが実行されると、$aが「オレンジ」に等しいかどうかがチェックされます。この場合はそうではありません。ただし、&&演算子があります。最初の部分($ a == "orange")はすでにfalseを返しているので、PHPは$ bが"orange"と等しいかどうかをチェックしますか?

||についても同じ質問があります:

$a = "orange";
$b = "orange";
if ($a == "orange" || $b == "orange") {
    //do stuff
}

$ aが「オレンジ」に等しいかどうかをチェックすると、trueを返します。それで|| 演算子はtrueを返し、PHPは||の2番目の部分もチェックしますか (私たちはすでにそれが真実になることを知っているので)?

うまくいけば、私はここで理にかなっています、そしてうまくいけば、誰かが私に答えを持っています。ありがとうございました!

4

2 に答える 2

6

PHPは、バイナリ条件(、またはそれらの定数に相当するものなど)を使用した短絡評価を使用するため、LHSの評価結果が、RHSが不要であることを意味する場合は、必要ありません。&&||

例えば...

method_exists($obj, 'func') AND $obj->func();

...この事実の悪用です。この例では、LHSが真の値を返した場合にのみRHSが評価されます。メソッドが存在する場合にのみメソッドを呼び出したいので、ここではロジックが理にかなっています(を使用していない限り、それは__call()別の話です)。

同様の方法で使用することもできますOR

defined('BASE_PATH') OR die('Restricted access to this file.');

このパターンは、直接アクセスされずに含まれることを目的としたPHPファイルの最初の行としてよく使用されます。BASE_PATH定数が存在しない場合、LHSは偽あるため、スクリプトであるRHSを実行しdie()ます。

于 2012-04-08T02:55:29.703 に答える
1

&&はい、PHPはand演算子を短絡し||ます。つまり、左側のオペランドの値が評価の必要がないことを意味する場合、右側のオペランドは評価されません。それらを最適化する必要はありません。次のようにテストできます。

function one() {
    echo "One";
    return false;
}

function two() {
    echo "Two";
    return true;
}

one() && two(); // Outputs One
echo "\n";
two() || one(); // Outputs Two

これがデモです。短絡がなかった場合は、次のようになります。

OneTwo
TwoOne
于 2012-04-08T02:58:21.697 に答える