Bedingte Anweisungen. Logische Operatoren in PHP Logische Operationen in einer Bedingung

PHP unterstützt die standardmäßigen logischen Operatoren AND und &&, OR und || , ! (nicht) und XOR . Mit logischen Operatoren können Sie die Ergebnisse zweier Operanden (eines Werts oder eines Ausdrucks) vergleichen, um zu bestimmen, ob einer oder beide „true“ oder „false“ zurückgeben, und um zu entscheiden, ob das Skript basierend auf dem zurückgegebenen Wert entsprechend weiter ausgeführt werden soll. Wie Vergleichsoperatoren geben logische Operatoren einen einzelnen booleschen Wert zurück – wahr oder falsch, abhängig von den Werten auf beiden Seiten des Operators.

Logisches ODER (OR und ||)

Der logische ODER-Operator wird als OR oder || bezeichnet . Es führt eine logische ODER-Verknüpfung an zwei Operanden durch. Wenn einer oder beide Operanden wahr sind, wird true zurückgegeben. Wenn beide Operanden falsch sind, wird false zurückgegeben. Sie haben wahrscheinlich eine Frage: Warum wurden zwei Versionen eines Operators erstellt? Der Sinn der beiden unterschiedlichen Varianten des logischen ODER-Operators besteht darin, dass sie mit unterschiedlichen Prioritäten arbeiten.

Schauen wir uns zunächst an, wie der ||-Operator funktioniert. . Wenn also einer oder beide seiner Operanden wahr sind, wird true zurückgegeben. Wenn beide Operanden falsche Werte zurückgeben, wird false zurückgegeben.

Der OR-Operator funktioniert genauso wie der ||-Operator. Mit einer Ausnahme: Wenn der OR-Operator mit einer Zuweisung verwendet wird, wertet er zuerst den Wert des linken Operanden aus und gibt ihn zurück. Ansonsten funktioniert er genauso wie der ||-Operator. , d.h. Wenn einer oder beide seiner Operanden wahr sind, wird true zurückgegeben. Wenn beide Operanden false zurückgeben, wird false zurückgegeben.

Um ihre Funktionsweise zu verdeutlichen, geben wir das folgende Beispiel:

1 // Zuerst wird der Variablen der Wert false zugewiesen, dann wird der zweite Operand ausgewertet // Prioritätsaktion: ($var2 = false) oder true $var2 = false oder true; echo $var2; // false wird nicht gedruckt // ($var3 = 0) oder 3 $var3 = 0 oder 3; Echo“
$var3"; // => 0 ?>

Beliebige Vergleichs- und logische Operatoren können zu komplexeren Strukturen zusammengefasst werden:

Es gibt noch einen weiteren wichtigen Punkt, der sowohl bezüglich der OR- als auch der ||-Operatoren erwähnt werden sollte. . Der logische ODER-Operator beginnt seine Auswertung mit seinem linken Operanden; wenn er „true“ zurückgibt, wird der rechte Operand nicht ausgewertet. Dies spart Ausführungszeit, es muss jedoch darauf geachtet werden, dass kein Code, von dem der korrekte Betrieb des Programms abhängen könnte, im rechten Operanden platziert wird.

Logisches UND (AND und &&)

Der logische UND-Operator wird als AND oder && bezeichnet. Es führt eine logische UND-Verknüpfung mit zwei Operanden durch. Es gibt genau dann true zurück, wenn beide Operanden true ergeben. Wenn einer oder beide Operanden false zurückgeben, gibt der Operator false zurück. Die Bedeutung der beiden unterschiedlichen Versionen des „logischen UND“-Operators ist dieselbe wie bei den beiden vorherigen Operatoren, nämlich, dass sie mit unterschiedlichen Prioritäten arbeiten.

Schauen wir uns zunächst an, wie der &&-Operator funktioniert. Wenn also beide Operanden wahr sind, wird true zurückgegeben. Wenn mindestens einer oder beide seiner Operanden false zurückgeben, wird auch false zurückgegeben.

Der AND-Operator funktioniert genauso wie der &&-Operator mit einer Ausnahme: Wenn der AND-Operator mit einer Zuweisung verwendet wird, wertet er zuerst den Wert des linken Operanden aus und gibt ihn zurück, ansonsten funktioniert er genauso wie der &&-Operator. Wenn mindestens einer seiner Operanden „false“ zurückgibt, wird auch „false“ zurückgegeben, und wenn beide Operanden „false“ zurückgeben, wird „false“ zurückgegeben.

Um das zu verstehen, schauen wir uns nun an, wie das in der Praxis funktioniert:

$bar3"; // => 9 ?>

Exklusives ODER (XOR)

Der Exklusiv-ODER-Operator wird als XOR bezeichnet. Es gibt true zurück, wenn nur einer seiner Operanden true ist. Wenn beide Operanden wahr sind, gibt der Operator false zurück.

Da der XOR-Operator die gleiche Priorität hat wie die AND- und OR-Operatoren (niedriger als der Zuweisungsoperator) und in einem Zuweisungsausdruck verwendet wird, wertet er zunächst den Wert des linken Operanden aus und gibt ihn zurück.

6 $a1 = 19 xor 5 > 6; var_dump($a1); // => 19 var_dump(true xor true); // false var_dump((2< 3) xor (5 != 5)); // true ?>

Logisches NICHT (!)

Der logische NICHT-Operator, auch Negation genannt, wird durch das Vorzeichen angezeigt! . Es handelt sich um einen unären Operator, der vor einem einzelnen Operanden steht. Der logische NOT-Operator wird verwendet, um den logischen Wert seines Operanden zu invertieren und gibt immer true oder false zurück.

Wenn Sie den Wert eines Ausdrucks umkehren müssen, beispielsweise a && b , müssen Sie Klammern verwenden: !(a && b) . Auch mit Hilfe eines Operators! Sie können jeden x-Wert in sein boolesches Äquivalent umwandeln, indem Sie den Operator !!x zweimal verwenden.

Letzte Aktualisierung: 01.11.2015

In PHP können wir verschiedene Operatoren verwenden: arithmetische, logische usw. Schauen wir uns jede Art von Operation an.

Rechenoperationen

    + (Additionsoperation)

    Beispiel: $a + 5

    - (Subtraktionsoperation)

    Beispiel: $a - 5

    * (Multiplikation)

    Beispiel: $a * 5

    / (Aufteilung)

    Beispiel: $a / 5

    % (Erhalten des Rests der Division)

    Zum Beispiel: $a=12; echo $a % 5; // entspricht 2

    ++ (Wert um eins erhöhen/erhöhen)

    Zum Beispiel ++$a

    Es ist wichtig, den Unterschied zwischen den Ausdrücken ++$a und $a++ zu verstehen. Zum Beispiel:

    $a=12; $b=++$a; // $b ist gleich 13 echo $b;

    Hier wird zunächst eins zum Wert der Variablen $a addiert und dann wird ihr Wert mit der Variablen $b gleichgesetzt. Anders wäre es, wenn der Ausdruck so aussehen würde: $b=$a++; . Hier war zunächst der Wert der Variablen $a gleich der Variablen $b, und dann wurde der Wert der Variablen $a erhöht.

    -- (Wert um eins verringern/verringern)

    Beispiel: --$a . Und wie beim Inkrementieren gibt es auch zwei Arten der Aufzeichnung: --$a und $a--

Zuweisungsoperatoren

    Setzt eine Variable einem bestimmten Wert gleich: $a = 5

    Addition und anschließende Zuordnung des Ergebnisses. Zum Beispiel: $a=12; $a += 5; echo $a; // gleich 17

    Subtraktion mit anschließender Zuweisung des Ergebnisses. Zum Beispiel: $a=12; $a -= 5; echo $a; // entspricht 7

    Multiplikation mit anschließender Zuweisung des Ergebnisses: $a=12; $a *= 5; echo $a; // entspricht 60

    Division und anschließende Zuweisung des Ergebnisses: $a=12; $a /= 5; echo $a; // gleich 2,4

    Verketten Sie Zeilen und weisen Sie das Ergebnis zu. Gilt für zwei Zeilen. Wenn die Variablen keine Zeichenfolgen, sondern beispielsweise Zahlen speichern, werden deren Werte in Zeichenfolgen umgewandelt und anschließend die Operation ausgeführt: $a=12; $a .= 5; echo $a; // gleich 125 // identisch mit $b="12"; $b .="5"; // gleich 125

    Den Rest der Division ermitteln und dann das Ergebnis zuweisen: $a=12; $a %= 5; echo $a; // entspricht 2

Vergleichsoperationen

Vergleichsoperationen werden üblicherweise in bedingten Strukturen verwendet, wenn es darum geht, zwei Werte zu vergleichen und je nach Ergebnis des Vergleichs bestimmte Aktionen auszuführen. Die folgenden Vergleichsoperationen stehen zur Verfügung.

    Der Gleichheitsoperator vergleicht zwei Werte und gibt bei Gleichheit „true“ zurück, andernfalls „false“: $a == 5

    Der Identitätsoperator vergleicht auch zwei Werte, und wenn sie gleich sind, gibt er „true“ zurück, andernfalls gibt er „false“ zurück: $a === 5

    Vergleicht zwei Werte, und wenn sie nicht gleich sind, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben: $a != 5

    Vergleicht zwei Werte, und wenn sie nicht gleich sind, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben: $a !== 5

    Vergleicht zwei Werte, und wenn der erste größer als der zweite ist, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben: $a > 5

    Vergleicht zwei Werte. Wenn der erste kleiner als der zweite ist, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben: $a< 5

    Vergleicht zwei Werte, und wenn der erste größer oder gleich dem zweiten ist, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben: $a >= 5

    Vergleicht zwei Werte. Wenn der erste kleiner oder gleich dem zweiten ist, wird „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben: $a<= 5

Gleichheits- und Identitätsbetreiber

Beide Operatoren vergleichen zwei Ausdrücke und geben „true“ zurück, wenn die Ausdrücke gleich sind. Aber es gibt Unterschiede zwischen ihnen. Wenn die Gleichheitsoperation zwei Werte unterschiedlichen Typs annimmt, werden sie auf einen reduziert – den, den der Interpreter für optimal hält. Zum Beispiel:

Offensichtlich speichern Variablen unterschiedliche Werte unterschiedlichen Typs. Beim Vergleich werden sie jedoch auf denselben Typ reduziert – numerisch. Und die Variable $a wird auf die Zahl 22 reduziert. Und am Ende sind beide Variablen gleich.

Oder zum Beispiel sind auch die folgenden Variablen gleich:

$a = falsch; $b = 0;

Um solche Situationen zu vermeiden, wird die Äquivalenzoperation verwendet, die nicht nur den Wert, sondern auch den Typ der Variablen berücksichtigt:

$a = "22a"; $b = 22; if($a===$b) echo "equal"; sonst echo „ungleich“;

Jetzt sind die Variablen nicht gleich.

Die Ungleichungsoperatoren != und !== funktionieren ähnlich.

Logische Operationen

Logische Operationen werden typischerweise verwendet, um die Ergebnisse zweier Vergleichsoperationen zu kombinieren. Beispielsweise müssen wir eine bestimmte Aktion ausführen, wenn mehrere Bedingungen erfüllt sind. Folgende logische Operationen stehen zur Verfügung:

    Gibt „true“ zurück, wenn beide Vergleichsoperationen „true“ zurückgeben, andernfalls wird „false“ zurückgegeben: $a == 5 && $b = 6

    Ähnlich der &&-Operation: $a == 5 und $b > 6

    Gibt „true“ zurück, wenn mindestens eine Vergleichsoperation „true“ zurückgibt, andernfalls wird „false“ zurückgegeben: $a == 5 || $b = 6

    Ähnlich der Operation || : $a< 5 or $b > 6

    Gibt „true“ zurück, wenn die Vergleichsoperation „false“ zurückgibt: !($a >= 5)

    Gibt true zurück, wenn nur einer der Werte wahr ist. Wenn beide wahr sind oder keines wahr ist, wird false zurückgegeben. Zum Beispiel: $a=12; $b=6; if($a xor $b) echo „true“; sonst echo „false“;

    Hier ist das Ergebnis der logischen Operation falsch, da beide Variablen einen bestimmten Wert haben. Ändern wir den Code:

    $a=12; $b=NULL; if($a xor $b) echo „true“; sonst echo „false“;

    Hier ist das Ergebnis bereits wahr, da der Wert einer Variablen nicht festgelegt ist. Wenn eine Variable den Wert NULL hat, wird ihr Wert in logischen Operationen als falsch behandelt

Bitoperationen

Bitoperationen werden an einzelnen Bits einer Zahl durchgeführt. Zahlen werden in binärer Darstellung betrachtet, zum Beispiel ist 2 in binärer Darstellung 010, die Zahl 7 ist 111.

    & (logische Multiplikation)

    Die Multiplikation erfolgt bitweise, und wenn beide Operanden Bitwerte gleich 1 haben, dann gibt die Operation 1 zurück, andernfalls wird die Zahl 0 zurückgegeben. Beispiel: $a1 = 4; //100 $b1 = 5; //101 echo $a1 & $b1; // entspricht 4

    Hier ist die Zahl 4 im Binärsystem 100 und die Zahl 5 101. Multiplizieren Sie die Zahlen bitweise und erhalten Sie (1*1, 0*0, 0 *1) = 100, also die Zahl 4 im Dezimalformat.

    | (logische Ergänzung)

    Ähnlich wie bei der logischen Multiplikation wird die Operation auch für Binärziffern ausgeführt, allerdings wird jetzt Eins zurückgegeben, wenn mindestens eine Zahl in einer bestimmten Ziffer eine Eins hat. Zum Beispiel: $a1 = 4; //100 $b1 = 5; //101 echo $a1 | $b1; // entspricht 5

    ~ (logische Negation)

    invertiert alle Bits: Wenn der Bitwert 1 ist, wird er zu Null und umgekehrt. $b = 5; echo ~$b;

    X<

    x>>y – verschiebt die Zahl x um y Stellen nach rechts. Beispiel: 16>>1 verschiebt 16 (was 10000 im Binärformat ist) um eine Stelle nach rechts, was 1000 oder 8 im Dezimalformat ergibt

Strings verketten

Der Punktoperator wird zum Verketten von Zeichenfolgen verwendet. Verbinden wir zum Beispiel mehrere Zeilen:

$a="Hallo,"; $b=" Welt"; echo $a . $b . „!“;

Wenn die Variablen andere Typen als Zeichenfolgen darstellen, z. B. Zahlen, werden ihre Werte in Zeichenfolgen konvertiert, und dann erfolgt auch die Zeichenfolgenverkettungsoperation.

In der Lektion werden bedingte PHP-Anweisungen behandelt: die if-Anweisung und die switch-Anweisung

Bedingte PHP-Anweisungen werden durch drei Hauptkonstrukte dargestellt:

  • Bedingungsoperator Wenn,
  • Schalterbetreiber schalten
  • Und ternärer Operator.

Schauen wir uns jeden einzelnen genauer an.

PHP if-Anweisung

Abbildung 3.1. Bedingte IF-Anweisung, Kurzversion


Reis. 3.2. Syntax der bedingten IF ELSE-Anweisung


Reis. 3.3. Vollständige Syntax der bedingten IF-Elseif-Anweisung

Fassen wir zusammen:

Vollständige Syntax:

if (condition) ( // wenn die Bedingung wahr ist, Operator1; Operator2; ) elseif(condition) ( Operator1; ... ) else ( // wenn die Bedingung falsch ist, Operator1; Operator2; )

  • Die verkürzte Syntax kann enthalten keine Teile der else-Klausel und keine zusätzliche elseif-Bedingung
  • Anstelle des Funktionsworts elseif können Sie auch else if (separat) schreiben.
  • In einem if-Konstrukt können mehrere elseifs enthalten sein. Der erste elseif-Ausdruck gleich TRUE wird ausgeführt.
  • Wenn es eine alternative elseif-Bedingung gibt, muss die else-Klausel in der Syntax an letzter Stelle stehen.

Eine bedingte Anweisung kann einen Doppelpunkt anstelle von geschweiften Klammern verwenden. In diesem Fall endet die Anweisung mit dem Hilfswort endif

Reis. 3.4. Bedingte Anweisung If und Endif in PHP

Beispiel:

if($x > $y): echo $x.“ ist größer als „.$y; elseif($x == $y): // bei Verwendung von „:“ können Sie nicht separat schreiben, sonst wenn echo $x.“ gleich „.$y; sonst: echo $x." not > und not = ".$y; endif;

Wichtig: Wenn in einer Konstruktion ein Doppelpunkt anstelle von geschweiften Klammern verwendet wird, kann elseif nicht in zwei Wörtern geschrieben werden!

Logische Operationen in einer Bedingung

Die if-Bedingung in Klammern kann die folgenden Operationen enthalten:

Beispiel:Überprüfen Sie den Wert einer numerischen Variablen: Wenn er kleiner oder gleich 10 ist, wird eine Meldung angezeigt „eine Zahl kleiner oder gleich 10“, andernfalls wird eine Meldung angezeigt „eine Zahl größer als 10“


Lösung:

$Anzahl=15; if ($number<=10) { echo "число меньше или равно 10"; } else { echo "число больше 10"; }

PHP-Codeblöcke können zerstört werden, schauen wir uns ein Beispiel an:

Beispiel: HTML-Code auf dem Bildschirm anzeigen „a ist gleich 4“, wenn die Variable $a wirklich gleich 4 ist


1 Lösung:
1 2 3 4

2 Lösung:

1 2 3 A ist gleich 4

A ist gleich 4

PHP-Job 3_1: Zeigen Sie die Übersetzung von Farben aus dem Englischen ins Russische an und überprüfen Sie den Wert der Variablen (in der die Farbe zugewiesen ist: $a="blue")


PHP-Job 3_2: Finden Sie das Maximum von drei Zahlen

Vergleichsoperationen und die Lügenregel

Das if-Konstrukt in Klammern muss einen logischen Ausdruck oder eine Variable enthalten, die aus Sicht der Algebra der Logik betrachtet wird und die Werte entweder wahr oder falsch zurückgibt

Diese. Eine einzelne Variable kann als Bedingung dienen. Schauen wir uns ein Beispiel an:

1 2 3 4 $a = 1 ; if ($a) ( echo $a; )

$a=1; if ($a) ( echo $a; )

Im Beispiel betrachtet der PHP-Sprachübersetzer die Variable in Klammern als Lügenregel:

Regel der Lüge oder was als falsch gilt:

  • logisch FALSCH
  • ganze Null ( 0 )
  • echte Null ( 0.0 )
  • leere Zeile und Schnur «0»
  • Array ohne Elemente
  • Objekt ohne Variablen
  • spezieller Typ NULL

Somit ist im betrachteten Beispiel die Variable $a gleich eins, dementsprechend ist die Bedingung wahr und der Operator echo $a; zeigt den Wert der Variablen an.

PHP-Job 3_3: Es wird eine Variable a mit einem Stringwert angegeben. Wenn a dem Namen entspricht, wird gedruckt „Hallo, Name!“, wenn a gleich einem leeren Wert ist, dann Ausgabe "Hallo Fremder!"

Logische Konstrukte AND OR und NOT im Bedingungsoperator

  1. Manchmal ist es erforderlich, die gleichzeitige Erfüllung mehrerer Bedingungen vorzusehen. Dann werden die Bedingungen kombiniert logischer Operator UND — && :
  2. $a=1; if ($a>0 || $a>1) ( echo "a > 0 or a > 1"; )

  3. Um anzugeben, ob eine Bedingung falsch ist, verwenden Sie logischer Operator NICHT — ! :
  4. 1 2 3 4 $a = 1 ; if (! ($a< 0 ) ) { echo "a не < 0" ; }

    $a=1; if (!($a<0)) { echo "a не < 0"; }

Switch-Operator PHP

Der Schalteroperator oder „Schalter“ ersetzt mehrere aufeinanderfolgende if-Konstrukte. Dabei vergleicht es eine Variable mit mehreren Werten. Daher ist dies das bequemste Mittel zur Organisation von Mehrfachverzweigungen.

Syntax:

1 2 3 4 5 6 7 8 9 10 switch ($variable) ( case „Wert1“ : Operator1 ; Pause ; Fall „Wert2“ : Operator2 ; Pause ; Fall „Wert3“ : Operator3 ; Pause ; [ Standard : Operator4 ; Pause ; ] )

switch($variable)( Fall „Wert1“: Operator1; Pause; Fall „Wert2“: Operator2; Pause; Fall „Wert3“: Operator3; Pause; )

  • Der Operator kann sowohl String-Werte (dann werden sie in Anführungszeichen angegeben) als auch numerische Werte (ohne Anführungszeichen) prüfen.
  • Die break-Anweisung in der Konstruktion ist erforderlich. Es verlässt das Konstrukt, wenn die Bedingung wahr ist und der der Bedingung entsprechende Operator wird ausgeführt. Ohne Pause werden alle Fallaussagen unabhängig von ihrem Wahrheitsgehalt ausgeführt.

Reis. 3.5. Bedingte Switch-Anweisung


Beispiel: Es wird ein Array mit vollständigen männlichen Namen angegeben. Überprüfen Sie das erste Element des Arrays und zeigen Sie je nach Name eine Begrüßung mit einem Kurznamen an.


Lösung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $names = array ("Ivan", "Peter", "Semyon"); switch ($names [ 0 ] ) ( case „Peter“ : echo „Hallo, Petya!“ ; break ; case „Ivan“ : echo „Hallo, Vanya!“ ; break ; case „Semyon“ : echo „Hallo, Vanya!“ " ; break ; default : echo "Hallo, $Namen!"; brechen ; )

$names=array("Ivan", "Peter", "Semyon"); switch($names)( case „Peter“: echo „Hallo, Petya!“; break; case „Ivan“: echo „Hallo, Vanya!“; break; case „Semyon“: echo „Hallo, Vanya!“; break ; Standard: echo „Hallo, $names!“; break; )

PHP-Job 3_4:

  • Erstellen Sie eine $day-Variable und weisen Sie ihr einen beliebigen numerischen Wert zu
  • Geben Sie die Phrase mithilfe des Schalterkonstrukts aus „Es ist ein Arbeitstag“, wenn der Wert der Variablen $day im Zahlenbereich von 1 bis 5 (einschließlich) liegt
  • Drucken Sie den Satz aus „Es ist ein freier Tag“, wenn der Wert der Variablen $day gleich den Zahlen 6 oder 7 ist
  • Drucken Sie den Satz aus „Unbekannter Tag“, wenn der Wert der Variable $day nicht in den Zahlenbereich von 1 bis 7 (einschließlich) fällt

Vervollständigen Sie den Code:

1 2 3 4 5 6 7 8 9 10 11 12 ... switch (... ) ( Fall 1 : Fall 2 : ... Echo „Es ist ein Arbeitstag“; brechen ; Fall 6: ... Standard: ...)

Switch(...)( Fall 1: Fall 2: ... echo „Es ist ein Arbeitstag“; Pause; Fall 6: ... Standard: ... )

Ternärer PHP-Operator

Ternärer Operator, d.h. mit drei Operanden, hat eine ziemlich einfache Syntax, in der links vom ? die Bedingung wird geschrieben, und auf der rechten Seite befinden sich zwei durch das Vorzeichen getrennte Operatoren: , links vom Vorzeichen wird der Operator ausgeführt, wenn die Bedingung wahr ist, und rechts vom Vorzeichen: der Operator wird ausgeführt, wenn die Bedingung wahr ist FALSCH.

Zustand? Operator1: Operator2;

PHP unterstützt den folgenden Standard logische Operatoren: „AND“ und „&&“ (logisches UND), „OR“ und „||“ (logisches ODER), „!“ (logisches NICHT) und „XOR“ (exklusives ODER). Sie alle werden in logischen Ausdrücken verwendet, um abhängig vom vom Ausdruck zurückgegebenen Ergebnis den einen oder anderen Ablauf der Programmausführung zu bestimmen, und beziehen sich auf binäre Operatoren, mit Ausnahme des Operators „!“. , was unär ist. Bei der Verwendung logischer Operatoren werden deren Operanden in den booleschen Datentyp () konvertiert und das Ergebnis hängt von den gegebenen logischen Werten der Operanden und dem Typ des logischen Operators ab (siehe Tabelle Nr. 1).

Tabelle Nr. 1. Logische Operatoren

Unterschied zwischen den Operatoren „AND“ und „&&“ sowie „OR“ und „||“ ist, dass die Operatoren „AND“, „OR“ und „XOR“ eine niedrigere Priorität haben, die sogar niedriger ist als die der Zuweisungsoperatoren (siehe PHP-Operatortabelle).

Es ist wichtig zu verstehen, wie der Interpreter boolesche Ausdrücke verarbeitet. Wenn in einem Ausdruck mit dem Operator „||“ Hat der erste (linke) Operand den Wert true oder in einem Ausdruck mit dem Operator „&&“ den ersten Operanden den Wert false , so wird der zweite (rechte) Operand nicht mehr berechnet. Dies liegt daran, dass sich das Endergebnis in solchen Fällen nicht ändert (siehe Tabelle Nr. 1) und daher keine Zeit für die Verarbeitung des Codes des zweiten Operanden aufgewendet werden muss. Sie müssen jedoch darauf achten, keinen Code im richtigen Operanden zu platzieren, von dem der korrekte Betrieb des Programms abhängen könnte.

Die Verwendung logischer Operatoren wird in Beispiel Nr. 2 gezeigt.

falsch $a=0||false; //Jetzt $a==true, weil 5->true und 8->true $a=5& //Jetzt $a==false, weil "0"->false $a="0"& //Jetzt $a==true $a=!false; //Jetzt $a==false, weil 5->true $a=!5; /* Funktion foo() wird wegen Shunts nicht aufgerufen */ $a=(false&&foo()); $b=(true||foo()); $c=(false und foo()); $d=(true or foo()); /* Differenz „||“ aus „oder“ und „&&“ aus „und“ */ //Wirkt wie ($a=(false||true)) $a=false||true; //Wirkt wie (($a=false) oder true) $a=false or true; //Wirkt wie ($a=(false&&true)) $a=false& //Wirkt wie (($a=false) und true) $a=false and true; //Jetzt verhält sich $a==5 wie (($a=5) xor 0) $a=5 xor 0; //Jetzt verhält sich $a==5 wie (($a=5) und 0) $a=5 und 0; //Jetzt verhält sich $a==5 wie (($a=5) or 0) $a=5 or 0; //Jetzt verhält sich $a==true wie ($a=(5||0)) $a=5||0; //Jetzt $a==false, verhält sich wie ($a=(5&&0)) $a=5& //Jetzt $a==true, verhält sich wie ($a=(5 xor 6)) $a=(5 xor 6); ?>

Beispiel Nr. 2. Verwendung boolescher Operatoren

>> Ich habe einige dieser Antworten gelesen und ehrlich gesagt keine gefunden, die die Unterschiede zwischen den Operatoren „||“ und „OR“ erklärt.

Der Unterschied wird im Link zur Operatorpriorität erläutert.

Das „||“ Operatoren werden vor der Zuweisung ausgewertet („="), während die „oder"-Operatoren nach der Zuweisung ausgewertet werden. In Ihrem zweiten Beispiel weisen Sie PHP an, zuerst das Ergebnis von „(choice1 != false ? „hah“ : „boo“)“ $val zuzuweisen und es dann mit „or“ gegen den Rest der Anweisung zu verknüpfen. Probieren Sie das folgende Beispiel aus und Sie werden sehen, was ich meine (beachten Sie die zusätzlichen Klammern, um den Vorrang zu erzwingen):

define ("choice1" , false );
define ("choice2" , "dog" );
define ("default1" , "other" );
$val = array();

$val [ „Test 1“ ] = (choice1 != false ? „hah“ : „boo“ ) || (choice2 != false ? "hah2" : "boo2" ) || (default1 != false ? "hah3" : "boo3" );
$val [ „Test 1b“ ] = ((choice1 != false ? „hah“ : „boo“ ) || (choice2 != false ? „hah2“ : „boo2“ ) || (default1 != false ? „hah3 " : "boo3" ));
$val [ „Test 2“ ] = (choice1 != false ? „hah“ : „boo“ ) or (choice2 != false ? „hah2“ : „boo2“ ) or (default1 != false ? „hah3“ : „ boo3" );
$val [ "Test 2b" ] = ((choice1 != false ? "hah" : "boo" ) or (choice2 != false ? "hah2" : "boo2" ) or (default1 != false ? "hah3" : "boo3" ));

Foreach ($val as $test => $result ) (
print("$test: "); var_dump ($result); drucken "
\N
\N" ;
}
?>

Test bei hto dot com

Weil die Abkürzung OR für einen if-Block mehr ergeben kann
Da es sich um lesbaren Code mit weniger Eingabeaufwand handelt, ist es verlockend, Funktionen zu erstellen, die bei einem Fehler FALSE oder bei Erfolg einen anderen Datentyp zurückgeben. Wie mysql_connect, das „bei Erfolg eine MySQL-Link-ID zurückgibt, oder FALSE bei Fehler.“

Der unerfahrene PHP-Entwickler sollte es vermeiden, Funktionen zu erstellen, die bei einem Fehler ein FALSE und bei Erfolg eine Ganzzahl erzeugen könnten, wenn die Möglichkeit besteht, dass die Ganzzahl Null sein könnte.

bla bla bla ;
$i = give_me_liberty () or die("FATAL DB ERROR!" );
bla bla bla ;
?>

ironmo67 bei Yahoo Dot com

Habe einen etwas nervigen Unterschied zwischen PHP und Perl entdeckt:


if (! some_function ()) return false ;
?>

kann nicht als hübscher umgeschrieben werden:

Funktion some_function ()( return false ; )
some_function() oder return false ;
?>

Folgendes wird jedoch funktionieren:

Funktion some_function ()( return false ; )
some_function() oder die();
?>

Kannst du erraten warum? Einfach ausgedrückt ist die() eine Funktion und „return“ eine Anweisung (so ähnlich wie der Unterschied zwischen print() und echo). Das ist wirklich schade, weil ich die if(!)()-Version langweilig und unlesbar finde, aber hey, sie ist besser als if (some_c_function == 0) (do Something).

Ein Großteil der folgenden Diskussion hätte vermieden werden können, indem einfach klargestellt worden wäre, dass &, | und ^ sind *keine* logischen Operatoren. Deshalb sind sie auf dieser Seite nicht aufgeführt. Dabei handelt es sich um Operatoren, die auf die binäre Darstellung von Zahlen einwirken. Sie nehmen keine logischen Werte (also „wahr“ oder „falsch“) als Argumente an, ohne sie vorher in die Zahlen 1 bzw. 0 umzuwandeln. Sie geben auch keine Werte zurück logische Werte, sondern Zahlen. Natürlich können Sie diese Zahlen später so behandeln, als wären sie logische Werte (in diesem Fall wird 0 in „falsch“ umgewandelt und alles andere wird in „wahr“ umgewandelt), aber das ist eine Folge von Die Typumwandlungsregeln von PHP haben nichts mit dem Verhalten der Operatoren zu tun.

Wenn Sie logische Operationen wünschen, verwenden Sie logische Operatoren. Wenn Sie bitweise Operationen wünschen, verwenden Sie bitweise Operatoren ... die Verwendung eines für den anderen scheint eine gute Möglichkeit zu sein, die Sache zu erschweren.

kws_ bei hotpop dot com

„Nur weil du es kannst, heißt das nicht, dass du es solltest.“

Ich habe auch das Gefühl, dass es sich um einen schlechten Stil handelt, wenn man die Kurzschlussauswertung umgeht und sich auf Nebenwirkungen in bedingten Ausdrücken verlässt. Das Schreiben von Code, der sich selbst anhand klarer und unkomplizierter Konstrukte dokumentiert, scheint mir eine viel bessere Vorgehensweise zu sein, als einen komplizierten und schwer lesbaren Ausdruck zu verwenden und ihn mit Kommentaren zu erklären (oder, noch schlimmer, ihn überhaupt nicht zu dokumentieren!). Das sollte der Quellcode tatsächlich tun mehr für die Augen des Programmierers als für die des Computers geschrieben werden.

Die Verwendung der bitweisen Operatoren in einem logischen Kontext könnte die Erwartungen des Lesers verletzen und zu Verwirrung führen, da bitweise Operatoren Bitfeldoperanden implizieren.

Ich bin auch der Meinung, dass die Annahme, dass die Kurzschlussauswertung für logische Konstrukte am besten ist, innerhalb der „Rechte“ des Compilers liegt, denn wenn logische Operatoren für ihren beabsichtigten Zweck verwendet werden, sind die Annahmen, dass Kurzschlüsse logisch *SIND*, und das auch der Fall (nochmals bei richtiger Anwendung) optimieren die Auswertung logischer Ausdrücke.

Es ist nicht meine Absicht, jemanden direkt anzugreifen oder zu beleidigen, sondern lediglich die Verwendung eines schlechten Stils zu unterbinden und neue (und sogar einige erfahrene) Programmierer zu ermutigen, klaren und ausführlichen Code zu schreiben und an die Programmierer zu denken und nicht an sie Computer, die möglicherweise versuchen, Ihre Kreationen zu entschlüsseln.

Als Antwort auf Braintreno:

Das zweite Beispiel, das Sie mitgebracht haben, zeigt, wie es richtig geht! Es ist überhaupt keine komplizierte Logik, es ist das, was Ihren Code lesbar macht, indem es sich nicht auf obskure Nebenwirkungen verlässt!! Es ist viel einfacher zu lesen als das erste und bei weitem einfacher zu pflegen.

Für die Idee, eine CheckThisOrOther()-Funktion Informationen nur an den Benutzer zurückgeben zu lassen, sollte Ihnen Ihre Programmierlizenz entzogen werden. Wenn ich jemals eines Ihrer Drehbücher pflegen müsste, müsste ich Sie hassen.

Das ist nicht so gemeint, wie es vielleicht klingt! Quellcode ist nicht für die Ausführung durch Computer geschrieben, sondern für den Programmierer zum Lesen! Behalten Sie das im Hinterkopf und Ihre Kollegen werden es Ihnen danken!

Braintrino

Der Beitrag von Shadedecho, die Auswertung beider OR-Ausdrücke zu erzwingen, ist eigentlich genau das, was getan werden sollte, um die Kurzschlussoptimierung zu unterdrücken.

Es gibt viele Fälle, in denen Sie nicht möchten, dass der Compiler eine Auswertung kurzschließt, insbesondere wenn Sie eine Und/oder-Situation durchführen möchten. Die Kurzschlussauswertung führt eine ODER-Operation durch, aber keine UND/ODER-Operation!!!

Wenn ich beispielsweise das Abfrageformular des Benutzers überprüfen möchte, um festzustellen, ob der Benutzer die Beantwortung eines Eintrags verpasst hat UND/ODER, ob der Benutzer dieselbe Antwort für mehr als einen Eintrag dupliziert hat, muss ich das Formular an den Kunden zurücksenden mitteilen, was ich korrigiert werden möchte.

Funktion SomeAnswersAreMissing()
{
...
echo „Ups! Du hast die Beantwortung einiger Fragen verpasst.“;
return TRUE;
}

Funktion SomeAnswersAreDuplicated()
{
...
echo „Ups! Sie können beide auf die gleiche Weise beantworten.“;
return TRUE;
}

If (SomeAnswersAreMissing() || SomeAnswersAreDuplicated())
SendFormAgain();

Wenn ich das mache, sieht der Benutzer nur die Warnung wegen fehlender Antworten, nicht aber die Warnung wegen doppelter Antworten, selbst wenn beide wahr sind. Dies ist für den Benutzer nicht informativ, da er/sie das Formular zweimal erneut einreichen muss, bevor er/sie erkennt, was er/sie falsch gemacht hat, und den Hack/die Hackerangriffe vereiteln. Das ist nicht benutzerfreundlich.

If (SomeAnswersAreMissing() | SomeAnswersAreDuplicated())
SendFormAgain();

Dann werden beide Warnmeldungen gleichzeitig gesendet und der Benutzer kann sie in einem erneuten Senden korrigieren.

Vielen Dank, Shadedecho, ich hatte nach einer Möglichkeit gesucht, die dumme Kurzschlussoptimierung des Compilers außer Kraft zu setzen. Der Computer kann nicht einfach davon ausgehen, dass Kurzschluss das Beste ist:(

Übrigens können Sie natürlich Folgendes tun:

$you_made_a_mistake = false;

If(SomeAnswersAreMissing())

if (SomeAnswersAreDuplicated())
$you_made_a_mistake = true;

Wenn ($you_made_a_mistake)
SendFormAgain();

Aber das ist verworrene Logik!!!

Hop

Lieber Neuling,

(Da ich nicht sehe, dass solche Ideen in den Köpfen erfahrener Programmierer aufkommen ...)

Bitte achten Sie nicht auf den Beitrag von Shadedecho vom 14. März 2003, 04:02 Uhr! Er verlässt sich stark auf obskure Nebenwirkungen, was nicht nur eine sehr schlechte Programmierpraxis ist, sondern auch nicht die Optimierung erreicht, die er glaubt.

Der richtige Weg, dies zu tun


echo $a;
}

Die Arbeit, wie sie Shadedecho will, ist (obwohl das Beispiel insgesamt eher ungeeignet ist):

$a .= blah();
$a .= blah2();

If ($a) ( echo $a; )

Wenn Sie die Diskussion lesen, auf die er verlinkt, werden Sie feststellen, dass er wirklich alle unterschiedlichen Einträge aus zwei verschiedenen Datenbanktabellen erhalten wollte. Auch da irrt er sich. Der richtige Weg, dies zu tun, besteht darin, die erste Tabelle und dann die zweite Tabelle zu verarbeiten.
Das ist nicht nur deutlich besser lesbar als der Workaround mit „|“, es ist auch nicht im Geringsten langsamer.

Shadedecho

Es scheint (nach viel frustrierender, aber letztendlich hilfreicher Suche und Diskussion in Foren wie Tek-Tips), dass die
|| und das && sind, wie bereits erwähnt, „kurzgeschlossen“, ABER das | und &-Operatoren (von PHP als bitweise Operatoren dokumentiert) verhalten sich jeweils wie ihre nicht kurzgeschlossenen Gegenstücke.

Funktion blah() (
echo „Hallo< br>";
return „von blah()“< br>";
}

Funktion blah2() (
echo "Welt\< br>";
return „von blah2()< br>";
}

If (($a .= blah()) || ($a .= blah2())) (
echo $a;
}

Dies würde zu folgender Ausgabe führen:

Hallo
von bla()

Beachten Sie, dass „world“ kein Echo erhalten hat und „from blah2()“ nicht in die Variable $a konkatiert wurde, da die erste Zuweisung an $a erfolgreich war, sodass der „Kurzschluss“ tritt ein und der boolesche Test wird beendet, ohne den Rest auszuwerten.

JEDOCH, wenn Sie || ersetzen mit nur | In dieser „if“-Anweisung erhalten Sie die Ausgabe:

Hallo
Welt
von bla()
von blah2()

Heureka! Soweit ich sehen kann, werden alle Teile des booleschen Tests in der erwarteten Reihenfolge von links nach rechts und nach allen normalen Vorrangregeln ausgewertet.

Das macht absolut Sinn ... Bei Verwendung der bitweisen Operatoren erfolgt die Operation auf bitweiser Ebene auf dem Ergebnis zweier nicht bitweiser Operationen (den Zuweisungen). Wenn eine nicht-bitweise Operation null zurückgibt (mit anderen Worten, der zugewiesene Wert ist null oder 0), bindet der bitweise Operator daran (oder würde ihn besser als „0“ „sehen“). andernfalls würde es einen Wert ungleich Null sehen (eine Folge von Bits mit mindestens einer „1“ darin).

Dann ein bitweises | wird mit den beiden Werten durchgeführt, und wenn einer davon ungleich Null ist (also „1“-Bits enthält), enthält das Ergebnis diese „1“-Bits (ungleich Null), und die if-Anweisung interpretiert alle Nicht-Null-Werte. Nullwert als wahr in einem booleschen Test. Ebenso, wenn beide Operanden zum | Wäre null oder 0, dann wäre das Ergebnis ein Nullwert, der „wenn“ als falsch interpretiert würde.

Die obige if-Anweisung führt ein bitweises | aus auf (in diesem Fall) zwei Werten ungleich Null (mit „1“ auf Bitebene), also | Die Operation gibt einen Wert ungleich Null zurück, der dann von der if-Anweisung als TRUE neu interpretiert wird!

In diesem speziellen Fall, in dem Sie versuchen, nicht kurzgeschlossene boolesche Tests aneinanderzureihen, arbeiten diese Operatoren auf bitweiser Ebene an ihren Operanden, und da es sich nicht um Vergleichsoperatoren, sondern um mathematische Operatoren handelt, können sie nicht kurzgeschlossen werden. geschaltet, und das resultierende Verhalten ist ein nicht kurzgeschlossener „boolescher Test“.

Ich weiß, Sie müssen denken, dass ich verrückt bin, wenn ich versuche, eine integrierte Optimierung wie diese zu umgehen, aber ich versichere Ihnen, es gibt einen sehr guten Grund dafür, und wenn Sie interessiert sind, können Sie sich wie ich diesen Thread ansehen Es gibt dort einen sehr langen Beitrag, der erklärt, was ich zu tun versucht habe:

Es ist der 9. Beitrag unten, in dem Sie meine Beschreibung meiner Datenbankabfrage finden, die ich optimieren wollte.

Was wahrscheinlich nicht das ist, was Sie wollen.

Dies kann für diejenigen hilfreich sein, die möchten, dass sich ihr Code wie Englisch liest, und vielleicht denken, dass die Prioritätsunterschiede dieser Operatoren relativ exotisch sind: Das ist nicht der Fall.

Was mich betrifft, bin ich auf dieses Problem gestoßen, weil es kein symbolisches logisches XOR gibt (zum Beispiel kein ^^), also musste ich XOR verwenden und dachte mir dann, dass ich an ähnlichen Stellen AND und OR und dann my verwenden sollte Code kaputt :)

Jetzt muss ich also
$a = ($b xor $c);

Jesse Thompson
biegen.com

yohgaki bei hotmail dot com

In PHP4 sind „und“, „oder“, „&&“, „||“ -- alle sind „Kurzschluss“ wie in C/C++. In PHP3 war das meiner Meinung nach nicht der Fall.

„Kurzschluss“ bedeutet, dass die Sprache die Auswertung des Ausdrucks stoppt, wenn Bedingungen ermittelt werden. (Die meisten Sprachen verwenden die Kurzschlussauswertung für den logischen Zustand)

$a = wahr;
$b = false;
if ($a || $b) (
}

Diese „if“-Anweisung wertet nur $a aus, da $a wahr ist und die gesamte Bedingung wahr sein muss. (d. h. wenn $b eine Funktion und kein Wert ist, wird die Funktion nicht aufgerufen)

muerte bei web-ster dot com

Ich hatte gehofft, einen Operator zu finden, der den ||=-Funktionen in Perl ähnelt. Mein erster Gedanke wäre:

$i = $i oder „Standard“

Aber oder so funktioniert es auch nicht. Wenn Sie Ihren Variablen nur dann einen Standardwert zuweisen möchten, wenn diese noch nicht zugewiesen sind, KÖNNEN Sie Folgendes tun:

$i oder $i = „Standard“

Das erste Beispiel funktioniert NICHT, da der Operator „or“ nicht wie in Perl überladbar ist.

Dante bei heartme dot com


Ich wollte so etwas machen:

$choice1 = "";
$choice2 = "Hund";
$default = "andere";
$val = $choice1 || $choice2 || $default;

Aber dann enthält $val1 nur 1 oder 0. Stattdessen habe ich Folgendes getan:

$choice1 = "";
$choice2 = "Hund";
$default = "andere";
$val = $choice1 oder $choice2 oder $default;

Jetzt enthielt $val die Zeichenfolge „dog“. Das ist
seltsam, dass „oder“ sich von „||“ unterscheidet ... und das würde ich auch tun
denke, dass das „||“ sollte klug genug sein, damit umzugehen
Zeichenfolgen ... so wie es PERL tut. Schätze nicht. Vielleicht ist es
eine Designentscheidung.