次のコードを考えます:
_if (is_valid($string) && up_to_length($string) && file_exists($file))
{
......
}
_
is_valid($string)
がfalse
を返す場合、PHPインタープリターはup_to_length($string)
のような後の条件を引き続きチェックしますか?
もしそうなら、必要がないのになぜ余分な仕事をするのですか
はい、PHPインタープリターは「遅延」です。つまり、条件を評価するために可能な限り最小限の比較を行います。
それを確認したい場合は、これを試してください:
function saySomething()
{
echo 'hi!';
return true;
}
if (false && saySomething())
{
echo 'statement evaluated to true';
}
はい、そうです。短絡評価に依存する小さなトリックを次に示します。時々、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()
の戻り値を無視します。 。
いいえ、最初の条件が満たされない場合、他の条件はもうチェックしません。
ビット演算子 は&
および|
。常に両方のオペランドを評価します。
論理演算子 はAND
、OR
、&&
、および||
。
AND
とOR
の優先順位は&&
および||
。以下の例を参照してください。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;
この例では、e
はtrue
になり、f
はfalse
になります。
今の私の調査に基づいて、PHPは同じ&&
JavaScriptとしての短絡演算子。
私はこのテストを実行しました:
$one = true;
$two = 'Cabbage';
$test = $one && $two;
echo $test;
およびPHP 7.0.8が返された1
、Cabbage
ではありません。
私は独自の短絡評価ロジックを作成しましたが、残念なことに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'