論理演算子、|| またはOR?


104

論理演算子に関してOR、を使用し||た方が使用した方が良いor(またはその逆)とのことで、しばらく前に読んだことを覚えています。

私が戻ってきたときにプロジェクトでこれを使用する必要がありましたが、どの演算子が推奨されたか、それが本当かどうかを思い出せません。

どちらがより良いのですか、そしてなぜですか?

回答:


139

「より良い」というものはありませんが、より一般的なのは||です。彼らは別の持っている優先度をし、||1が通常期待されるように動作します。

参照:論理演算子次の例はそこから取られています):

// 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;

11
そして、$e = true || $x = 'foo'定義しています$xので、短絡の、ではないので、優先順位が上。
マット・キーラン2014

1
最後にチェックされた値を返す他の多くの言語とは異なり、これらは常にブール値を返すことにも注意してください。したがって、PHP(27 || 0)では、27ではなくtrueを返します
TextGeek 2017

@TextGeek、「これ」?私のために27 or 0戻ります27
ジャニスElmeris

@JānisElmeris-あなたは正しい、私は "||"だけを参照すべきだった 場合。
TextGeek 2018

2
@TextGeek、実際には、orブール値も返すのはあなたです。優先度が非常に低いため、他のことをしているように見える場合があります。:) print 27 or 0後に発生する27ため、印刷さます。ところで、だまされていません- 出力されます。or print 27echoecho 27 or 01
ジャニスElmeris

43

これらはさまざまな目的で使用され、実際にはさまざまな演算子の優先順位があります。&&そして||、一方の演算子は、ブール条件のために意図されているandor制御フローのために意図されています。

たとえば、次はブール条件です。

if ($foo == $bar && $baz != $quxx) {

これは制御フローとは異なります。

doSomething() or die();

die()場合関数が呼び出されますdoSomething()戻りますfalsenulldoSomething()返品されるtrueか、または返品されない場合はどうなりますか?
giannis christofakis 2013年

5
doSomething()ブール値として評価されます。PHPが真と見なす値(true、空でない文字列など)を返す場合、は呼び出されませんdie()
Matthew Ratzloff 2013年

23

それぞれの違い|| and ORおよび&& and ANDは演算子の優先順位です。

$bool = FALSE || TRUE;

  • と解釈される ($bool = (FALSE || TRUE))
  • の値$boolTRUE

$bool = FALSE OR TRUE;

  • と解釈される (($bool = FALSE) OR TRUE)
  • の値$boolFALSE

$bool = TRUE && FALSE;

  • と解釈される ($bool = (TRUE && FALSE))
  • の値$boolFALSE

$bool = TRUE AND FALSE;

  • と解釈される (($bool = TRUE) AND FALSE)
  • の値$boolTRUE

5

ソース: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>

リンクが壊れています。
Peter Mortensen

2

私はそれが古いトピックであることを知っていますが、それでもまだです。私は仕事でデバッグしているコードで問題に会ったばかりで、誰かが同様の問題を抱えているかもしれません...

コードが次のようになっているとしましょう:

$positions = $this->positions() || [];

$ this-> positions()がfalseまたはnullを返す場合、$ positionsは空の配列であることが期待されます(たとえば、javascriptから慣れているため)。しかし、そうではありません。値がTRUEまたはFALSEの場合、$ this-> positions()が返す内容によって異なります。

$ this-> positions()または空の配列の値を取得する必要がある場合は、以下を使用する必要があります。

$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() ?: [];

PHP 7.2.1でテスト済み


不正解です。2番目の例は最初の例とまったく同じように機能します
WayFarer

うまく@WayFarer、それは(問題がある)正しくないのですが、あなたしている間違っすぎ(||とOR同じではありません) -私の編集を参照
ズデニェク

右、演算子|| と 'or'は優先度が異なるため、2番目の例は(($ second = returnEmpty())または[]);のように機能します。したがって、元の質問に対する答えは||になります。「or」を使用する理由が本当にわかるまでは、常にそれを使用してください
WayFarer

1
$positions = $this->positions() ?? [];おそらくあなたが望むものです。
ビショップ

0

本質的に別の1つより優れているとは思わないが、||に固執することをお勧めします。ほとんどの言語ではデフォルトだからです。

編集:他の人が指摘したように、実際には2つの間に違いがあります。


0

悪いことや良いことは何もありません。それは、演算子の優先順位に依存します。以来は、||より高い優先順位を持っているorので、||ほとんど使用されています。


-3

一部の言語はショートサーキットを使用し、他の言語は完全なブール評価を使用します(ご存知の場合、これは$BPascal のディレクティブに似ています)。

説明:

function A(){
    ...Do something..
    return true;
}

function B(){
    ...Do something..
    return true;
}

if ( A() OR B() ) { .....

この例では、関数B()は実行されません。関数A()はTRUEを返すため、ORステートメントの結果は、式の2番目の部分を評価する必要なく、最初の部分からわかります。

ただし、( A() || B() )では、2番目の部分は最初の部分の値に関係なく常に評価されます。

最適化されたプログラミングでは、常にOR速い方を使用する必要があります(最初の部分が戻りfalse、2番目の部分が実際に評価される必要がある場合を除く)。


これは「ベストアンサー!!」ではありません。上にスクロールして、最もよく投票された回答を参考にしてください。で||B呼び出されません。優先順位が異なることを除いて、両方の演算子はまったく同じです。
bzeaman 2014年

「あなたはいつも使用またはより高速である必要があり、」これが本当であればうーん、私は不思議...ので、チェックすることをしてみましょう:3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabsオペコードの数です。同じ。したがって、パフォーマンスは問題ではありません。
イェンスA.コッホ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.