Kurzgeschlossene Verknüpfungsoperatoren

Um in if-Abfragen mehrere Bedingungen miteinander zu verknüpfen werden Verknüpfungsoperatoren verwendet. PHP bietet dafür AND, & und && bzw. OR, | und ||.

Dabei entsprechen AND und & sowie OR und | einander. && und || heißen kurzgeschlossene Operatoren.

Der Unterschied zwischen kurzgeschlossenen und einfachen Operatoren ist, dass bei einer „normalen“ Abfrage:

if($var1=="hallo" & $var2=="Welt") echo "ja";

sowohl die erste als auch die 2.Bedingung überprüft wird. Das bedeutet, auch wenn die erste Bedingung $var1==“hallo“ bereits false ist, wird die zweite Bedingung überprüft, obwohl da bereits feststeht, dass der Gesamtausdruck false wird.

Korrespondierend dazu eine ODER-Bedingung:

if($var1=="hallo" | $var2=="Welt")

Wenn die erste Bedingung true ist, wird die zweite trotzdem überprüft, obwohl bereits nach der ersten Überprüfung feststeht, dass der Ausdruck auf jeden Fall true wird.

Bei kurzgeschlossenen Operatoren ist dies anders: Sobald PHP bemerkt, dass der ganze Ausdruck gar nicht mehr true werden kann bzw. auf jeden Fall true wird, wird keine weitere Rechenzeit damit vergeudet, die restlichen Ausdrücke noch auszuwerten.

Mittlerweile muss dieser Tipp allerdings als Mythos genannt werden, denn PHP optimiert die Abfragen intern selbst und es entstehen keine Geschwindigkeitsunterschiede (unter PHP 5).

Erstmal gilt somit: Verknüpfungsoperatoren AND, & und && sowie OR, | und || sind gleich performant.

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
langgeschlossen.php 26,45 s 2,645 ms 100%
kurzgeschlossen.php 26,49 s 2,649 ms 100%

Die Verwendung von kurzgeschlossenen Operatoren hat aber andere Vorteile.
Wenn man nicht weiß, ob eine bestimmte Variable / ein Objekt existiert kann man zuerst abfragen, ob es existiert und danach dessen Wert überprüfen:

if(isset($arr) && in_array($value,$arr)) echo "true";
if(isset($arr) & in_array($value,$arr)) echo "true";

Beide Möglichkeiten stimmen logisch überein. Falls allerdings bei der zweiten Variante das Array nicht existiert, wird ein Fehler geworfen (Warning: Wrong datatype for second argument), da dann in_array() nicht ausgeführt werden kann. Bei der ersten Variante merkt der Interpreter, dass der Ausdruck nicht mehr true werden kann, weil $arr nicht gesetzt ist und setzt die Arbeit somit ohne Fehler fort.
Die erste Variante kann somit Quellcode gegenüber folgender Variante sparen:

if(isset($arr)) {
  if(in_array($value,$arr)) {
    ...
  }
}

Die kurzgeschlossene Variante hat also ihre Berechtigung, schneller ist sie allerdings nicht.

Quellcodes: Quellcodes
Benchmark: Benchmarkergebnis

Jan hat 152 Beiträge geschrieben

4 Kommentare zu “Kurzgeschlossene Verknüpfungsoperatoren

  1. TB sagt:

    Bei & und | handelt es sich um Bit-Operatoren, die beteiligte Variablen binär miteinander vergleichen und binär einen Wert liefern, der alle gleichen bzw. alle ungleichen Bits enthalten.

    Bsp. 4 & 5 => 100 & 101 = 100 => 4

  2. Tim sagt:

    @TB: Genau. Ich habe mich schon gewundert. & und | sind keine Vernküpfungs- sondern binäre (!) Vergleichsoperatoren.

  3. Andreas sagt:

    Entsprechen nicht AND und && einander und OR und || statt AND und & und OR und | ?

    Sind AND, &&, OR und || nicht „Vergleichsoperatoren“ und & und | „Modifikationsoperatoren“? (Äpfel vs. Birnen ;-))

    Für & und | gibt es doch auch die Kurzformen &= und |= wie bei anderen Modifikationsoperatoren (+, -, * etc.)

    Ich finde die Seite super, aber hier hast Du glaube ich ein paar Sachen durcheinander gehauen..

  4. admin sagt:

    Ja das stimmt. Da wars wohl etwas spät 😉
    Deine Vorgänger haben mich davon bereits überzeugt, aber ich wollte deshalb nicht den Artikel löschen.

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>