Logische Operatoren, || oder oder?

103

Ich erinnere mich , eine Weile zurück in Bezug auf die logischen Operatoren zu lesen , dass im Falle OR, indem ||war besser als or(oder umgekehrt).

Ich musste dies nur in meinem Projekt verwenden, als es zu mir zurückkam, aber ich kann mich nicht erinnern, welcher Operator empfohlen wurde oder ob es überhaupt wahr war.

Was ist besser und warum?

Es ist ausgesprochen
quelle

Antworten:

139

Es gibt kein "besseres", aber das üblichere ||. Sie haben unterschiedliche Vorrang und ||würden so funktionieren, wie man es normalerweise erwarten würde.

Siehe auch: Logische Operatoren ( das folgende Beispiel stammt von dort ):

// 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;
Felix Kling
quelle
11
und $e = true || $x = 'foo'wird nicht $xwegen Kurzschluss definiert, nicht wegen höherer Priorität.
Matt Kieran
1
Es ist auch erwähnenswert, dass diese immer einen booleschen Wert zurückgeben, im Gegensatz zu vielen anderen Sprachen, in denen sie den zuletzt überprüften Wert zurückgeben. In PHP (27 || 0) wird also true zurückgegeben , nicht 27 .
TextGeek
@TextGeek, "diese"? 27 or 0kehrt 27für mich zurück.
Jānis Elmeris
@ Jānis Elmeris - Sie haben Recht, ich hätte mich nur auf das "||" beziehen sollen Fall.
TextGeek
2
@TextGeek, tatsächlich haben Sie Recht, ordas auch Boolesche Werte zurückgibt. Nur seine Priorität ist so niedrig, dass es manchmal so aussieht, als würde es etwas anderes tun . :) print 27 or 0würde drucken, 27weil ores danach passiert print 27. Übrigens, lässt echosich nicht täuschen - echo 27 or 0würde ausgeben 1.
Jānis Elmeris
43

Sie werden für unterschiedliche Zwecke verwendet und haben tatsächlich unterschiedliche Operatorprioritäten. Die &&und ||Operatoren für Boolesche Bedingungen bestimmt, während andund orfür die Ablaufsteuerung vorgesehen sind.

Das Folgende ist beispielsweise eine boolesche Bedingung:

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

Dies unterscheidet sich vom Kontrollfluss:

doSomething() or die();
Matthew Ratzloff
quelle
die()Funktion wird aufgerufen, wenn zurückgegeben doSomething()wird falseoder null? Was ist, wenn doSomething()zurück trueoder nichts?
Giannis Christofakis
5
doSomething()wird als Boolescher Wert ausgewertet. Wenn es einen Wert zurückgibt, den PHP für wahr hält ( true, eine nicht leere Zeichenfolge usw.), wird es nicht aufgerufen die().
Matthew Ratzloff
23

Der Unterschied zwischen jeweils || und OR und && und AND haben Vorrang vor dem Operator :

$bool = FALSE || TRUE;

  • Interpretiert als ($bool = (FALSE || TRUE))
  • Wert von $boolistTRUE

$bool = FALSE OR TRUE;

  • Interpretiert als (($bool = FALSE) OR TRUE)
  • Wert von $boolistFALSE

$bool = TRUE && FALSE;

  • Interpretiert als ($bool = (TRUE && FALSE))
  • Wert von $boolistFALSE

$bool = TRUE AND FALSE;

  • Interpretiert als (($bool = TRUE) AND FALSE)
  • Wert von $boolistTRUE
John Slegers
quelle
5

Quelle: http://wallstreetdeveloper.com/php-logical-operators/

Hier ist ein Beispielcode für die Arbeit mit logischen Operatoren:

<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>
Improgrammer
quelle
Die Verbindung ist unterbrochen.
Peter Mortensen
2

Ich weiß, dass es ein altes Thema ist, aber immer noch. Ich habe gerade das Problem in dem Code getroffen, den ich bei der Arbeit debugge, und vielleicht hat jemand ein ähnliches Problem ...

Angenommen, der Code sieht folgendermaßen aus:

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

Sie würden erwarten (wie Sie es von z. B. Javascript gewohnt sind), dass $ positions ein leeres Array ist, wenn $ this-> positions () false oder null zurückgibt. Aber es ist nicht so. Der Wert TRUE oder FALSE hängt davon ab, was $ this-> positions () zurückgibt.

Wenn Sie den Wert von $ this-> positions () oder ein leeres Array erhalten möchten, müssen Sie Folgendes verwenden:

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

BEARBEITEN:

Das obige Beispiel funktioniert nicht wie beabsichtigt , aber die Wahrheit ist , dass ||und orist nicht das gleiche ... Versuchen Sie folgendes:

<?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";

Das ist das Ergebnis:

bool(false)
NULL
array(0) {
}

Die dritte Option ?:ist also die richtige Lösung, wenn Sie einen zurückgegebenen Wert oder ein leeres Array festlegen möchten.

$positions = $this->positions() ?: [];

Getestet mit PHP 7.2.1

Zdeněk
quelle
Es ist eine falsche Antwort, das zweite Beispiel funktioniert genau wie das erste
WayFarer
@ WayFarer gut, es ist nicht korrekt (es gibt ein Problem), aber Sie liegen auch falsch (|| und OR ist nicht dasselbe) - siehe meine Bearbeitung
Zdeněk
rechts, Operatoren || und 'oder' haben unterschiedliche Prioritäten, daher funktioniert Ihr zweites Beispiel wie folgt: (($ second = returnEmpty ()) oder []); Die Antwort auf die ursprüngliche Frage wäre also || ist besser, benutze es immer, bis du wirklich verstehst, warum du 'oder' verwenden
willst
1
$positions = $this->positions() ?? [];ist wahrscheinlich was du willst.
Bischof
0

Ich denke nicht, dass einer von Natur aus besser ist als ein anderer, aber ich würde vorschlagen, bei || zu bleiben weil es in den meisten Sprachen die Standardeinstellung ist.

EDIT: Wie andere darauf hingewiesen haben, gibt es tatsächlich einen Unterschied zwischen den beiden.

exahex
quelle
0

Es gibt nichts Schlechtes oder Besseres. Es hängt nur von der Priorität der Bediener ab. Da ||hat höhere Priorität als or, so ||wird meistens verwendet.

Nishu Tayal
quelle
-3

Einige Sprachen verwenden einen Kurzschluss, andere eine vollständige boolesche Auswertung (wenn Sie wissen, ähnelt dies der Direktive $Bin Pascal).

Erklärungen:

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

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

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

In diesem Beispiel wird die Funktion B()niemals ausgeführt. Da die Funktion A()TRUE zurückgibt, ist das Ergebnis der OR-Anweisung aus dem ersten Teil bekannt, ohne dass der zweite Teil des Ausdrucks ausgewertet werden muss.

Mit ( A() || B() )wird jedoch immer der zweite Teil unabhängig vom Wert des ersten ausgewertet.

Für eine optimierte Programmierung sollten Sie immer ORdie schnellere verwenden (außer in dem Fall, in dem der erste Teil zurückkehrt falseund der zweite Teil tatsächlich ausgewertet werden muss).

janhsh
quelle
Dies ist nicht die beste Antwort! Bitte scrollen Sie zurück nach oben und nehmen Sie die am häufigsten gewählte Antwort für eine gute Erklärung. Mit dem ||, Bwird nicht aufgerufen werden. Beide Operatoren machen genau das Gleiche, außer dass die Priorität unterschiedlich ist.
Bzeaman
"Sie sollten immer OR verwenden, das schneller ist" Hmm, ich frage mich, ob dies wahr ist. Überprüfen wir also Folgendes : 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs Die Anzahl der Opcodes ist die gleich. In Bezug auf die Leistung spielt es also keine Rolle.
Jens A. Koch