論理演算子に関して、しばらく前に読んだことを覚えています。論理演算子の場合OR
、使用する||
方が優れていましたor
(またはその逆)。
プロジェクトでこれを使用しなければならなかったのですが、どのオペレーターが推奨されたのか、それが本当だったのか思い出せません。
どちらが良いのか、そしてその理由は?
論理演算子に関して、しばらく前に読んだことを覚えています。論理演算子の場合OR
、使用する||
方が優れていましたor
(またはその逆)。
プロジェクトでこれを使用しなければならなかったのですが、どのオペレーターが推奨されたのか、それが本当だったのか思い出せません。
どちらが良いのか、そしてその理由は?
「より良い」というものはありませんが、より一般的なものは||
です。それらは異なる優先順位を持ち||
、通常期待されるように機能します。
参照:論理演算子(次の例はそこから抜粋したものです):
// 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 and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
これらはさまざまな目的で使用され、実際にはさまざまな演算子の優先順位があります。&&
and||
演算子はブール条件を対象としていますが、and
とor
は制御フローを対象としています。
たとえば、以下はブール条件です。
if ($foo == $bar && $baz != $quxx) {
これは制御フローとは異なります。
doSomething() or die();
それぞれの違い|| AND OR and && and ANDは演算子の優先順位です:
$bool = FALSE || TRUE;
($bool = (FALSE || TRUE))
$bool
はTRUE
$bool = FALSE OR TRUE;
(($bool = FALSE) OR TRUE)
$bool
はFALSE
$bool = TRUE && FALSE;
($bool = (TRUE && FALSE))
$bool
はFALSE
$bool = TRUE AND FALSE;
(($bool = TRUE) AND FALSE)
$bool
はTRUE
ソース:http ://wallstreetdeveloper.com/php-logical-operators/
論理演算子を操作するためのサンプルコードは次のとおりです。
<html>
<head>
<title>Logical</title>
</head>
<body>
<?php
$a = 10;
$b = 20;
if ($a>$b)
{
echo " A is Greater";
}
elseif ($a<$b)
{
echo " A is lesser";
}
else
{
echo "A and B are equal";
}
?>
<?php
$c = 30;
$d = 40;
//if (($a<$c) AND ($b<$d))
if (($a<$c) && ($b<$d))
{
echo "A and B are larger";
}
if (isset($d))
$d = 100;
echo $d;
unset($d);
?>
<?php
$var1 = 2;
switch($var1)
{
case 1: echo "var1 is 1";
break;
case 2: echo "var1 is 2";
break;
case 3: echo "var1 is 3";
break;
default: echo "var1 is unknown";
}
?>
</body>
</html>
私はそれが古いトピックであることを知っていますが、それでも。仕事でデバッグしているコードで問題が発生したばかりですが、誰かが同様の問題を抱えている可能性があります...
コードが次のようになっているとしましょう。
$positions = $this->positions() || [];
$ this-> position()がfalseまたはnullを返す場合、$ positionは空の配列であると(たとえばjavascriptから慣れているように)期待します。しかし、そうではありません。値がTRUEまたはFALSEであるかどうかは、$ this-> position()が何を返すかによって異なります。
$ this-> position()の値または空の配列を取得する必要がある場合は、次を使用する必要があります。
$positions = $this->positions() or [];
編集:
上記の例は意図したとおりに機能しませんが、真実は同じ||
でor
はありません...これを試してください:
<?php
function returnEmpty()
{
//return "string";
//return [1];
return null;
}
$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];
var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";
結果は次のとおりです。
bool(false)
NULL
array(0) {
}
したがって、実際に?:
は、戻り値または空の配列を設定する場合は、3番目のオプションが正しい解決策です。
$positions = $this->positions() ?: [];
PHP7.2.1でテスト済み
あるものが他のものより本質的に優れているとは思いませんが、||に固執することをお勧めします ほとんどの言語のデフォルトだからです。
編集:他の人が指摘しているように、実際には2つの間に違いがあります。
悪いことも良いこともありません。演算子の優先順位に依存します。||
より優先順位が高いのでor
、||
主に使用されます。
一部の言語は短絡を使用し、他の言語は完全なブール評価を使用します(ご存知の場合、これは$B
Pascalのディレクティブに似ています)。
説明:
function A(){
...Do something..
return true;
}
function B(){
...Do something..
return true;
}
if ( A() OR B() ) { .....
この例では、関数B()
は実行されません。関数A()
はTRUEを返すため、ORステートメントの結果は、式の2番目の部分を評価する必要なしに、最初の部分からわかります。
ただし、を使用する( A() || B() )
と、最初の部分の値に関係なく、2番目の部分が常に評価されます。
プログラミングを最適化するには、常にどちらか速い方を使用する必要があります(最初の部分が返され、2番目の部分を実際に評価する必要がOR
ある場合を除く)。false