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

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.


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0