== prüft, ob zwei Werte gleich sind, nachdem PHP sie in einen gemeinsamen Typ umgewandelt hat. === prüft, ob sie gleich und vom selben Typ sind. Also ist 1 == "1" gleich true, während 1 === "1" gleich false ist.
Die meisten Bugs bei Vergleichen entstehen, weil == etwas umwandelt, womit du nicht gerechnet hast. Ein guter Standard ist === und !==; wechsle nur dann zu ==, wenn du die Umwandlung bewusst willst.
Alle Vergleichsoperatoren in PHP
| Operator | Name | Wahr, wenn |
|---|---|---|
$a == $b | Gleich | gleich nach Typumwandlung |
$a === $b | Identisch | gleich und vom selben Typ |
$a != $b, $a <> $b | Ungleich | ungleich nach Typumwandlung |
$a !== $b | Nicht identisch | ungleich oder verschiedene Typen |
$a < $b, $a > $b | Kleiner als, größer als | |
$a <= $b, $a >= $b | Kleiner oder gleich, größer oder gleich | |
$a <=> $b | Spaceship | liefert -1, 0 oder 1 |
Tabelle für lockeren und strikten Vergleich
Jede Zelle dieser Tabelle wurde von PHP 8.3 berechnet. Wechsle zwischen == und === und tippe auf eine Zelle, um den Ausdruck zu sehen. Das Raster für == steckt voller Überraschungen in den Zeilen für null, "", "0" und []; das Raster für === ist nur seine Diagonale.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Wie == verschiedene Typen vergleicht
Die Regeln, denen PHP 8 folgt, in der Reihenfolge, in der sie in der Praxis zählen:
- Zwei numerische Strings werden als Zahlen verglichen:
"10" == "1e1"und"1" == "01"sind beidetrue. - Eine Zahl und ein numerischer String: Der String wird zur Zahl.
100 == "1e2"isttrue. - Eine Zahl und ein nicht numerischer String: Seit PHP 8 wird die Zahl zum String, und beide werden als Strings verglichen.
0 == "a"istfalse(in PHP 7 war estrue). - Irgendetwas und ein Bool: Beide Seiten werden in bool umgewandelt.
"a" == trueund[] == falsesindtrue. - null und ein String:
nullwird zu"", also istnull == ""gleichtrue, abernull == "0"gleichfalse. Gegenüber jedem anderen Typ wirdnullwiefalseverglichen. - Zwei Arrays: gleich, wenn sie dieselben Schlüssel/Wert-Paare haben.
Die letzte Zeile zeigt, warum Größenvergleiche mit null selten sinnvoll sind: null wird zu false, -1 wird zu true, und false < true.
Ungleich: != vs !==
!= und <> sind derselbe Operator. !== ist die strikte Version. Der Unterschied zählt am meisten bei Funktionen, die 0 oder false zurückgeben, etwa strpos:
0 != false ist false, weil 0 in false umgewandelt wird. 0 !== false ist true, weil ein int kein bool ist. Dieselbe Falle gilt für array_search und für in_array ohne sein Strict-Flag.
Strings vergleichen
< und > vergleichen Strings Byte für Byte (bei reinem ASCII alphabetisch). Wenn beide Strings numerisch sind, werden sie als Zahlen verglichen. Für Vergleiche ohne Groß- und Kleinschreibung oder in „natürlicher“ Reihenfolge nimmst du die Funktionen:
Der Spaceship-Operator <=>
$a <=> $b liefert -1, wenn $a kleiner ist, 0, wenn beide gleich sind, und 1, wenn $a größer ist. Er folgt denselben Regeln wie < und == und ist der kürzeste Weg, einen Sortier-Callback zu schreiben.
Zwei Arrays mit <=> zu vergleichen, vergleicht sie Element für Element, und so sortiert der Callback zuerst nach Alter und dann nach Name. Weitere Sortierrezepte stehen auf der Seite zum Sortieren von Arrays.
Typischer Fehler: Floats mit == vergleichen
Floats werden binär gespeichert, deshalb sind viele Dezimalwerte nur Näherungen. 0.1 + 0.2 ist nicht genau 0.3, und == sieht den Unterschied.
Für Geldbeträge speicherst du ganze Cent als Ganzzahlen und vergleichst diese mit ===.
Häufig gestellte Fragen
Was ist der Unterschied zwischen == und === in PHP?
== wandelt beide Seiten in einen gemeinsamen Typ um und vergleicht dann, also ist 1 == "1" gleich true. === ist nur wahr, wenn die Werte gleich sind und denselben Typ haben, also ist 1 === "1" gleich false. Verwende ===, außer du willst die Umwandlung.
Ist 0 == "a" in PHP true?
Seit PHP 8 nicht mehr. Wenn eine Zahl mit einem nicht numerischen String verglichen wird, vergleicht PHP 8 beide als Strings, also ist 0 == "a" gleich false. In PHP 7 wurde der String in 0 umgewandelt und das Ergebnis war true.
Was ist der Unterschied zwischen != und !== in PHP?
!= (und sein Alias <>) ist das Gegenteil von ==: Es ist falsch, wenn die Werte nach der Typumwandlung gleich sind. !== ist das Gegenteil von ===: Es ist wahr, wenn sich die Werte oder ihre Typen unterscheiden, also ist 0 !== false gleich true, während 0 != false gleich false ist.
Wie vergleiche ich zwei Floats in PHP?
Verwende kein == auf Ergebnisse von Float-Rechnungen: 0.1 + 0.2 == 0.3 ist false. Vergleiche stattdessen die Differenz mit einer kleinen Toleranz, abs($a - $b) < PHP_FLOAT_EPSILON, oder runde beide auf die Genauigkeit, die dir wichtig ist.