Menu

PHP Vergleichsoperatoren: == vs === und <=>

PHP vergleicht Werte mit == (gleich nach Typumwandlung), === (gleicher Wert und gleicher Typ), != und !==, < > <= >= und dem Spaceship-Operator <=>. Wann == Typen umwandelt, was sich in PHP 8 geändert hat und jeder lockere und strikte Vergleich in einer Tabelle.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

== 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

OperatorNameWahr, wenn
$a == $bGleichgleich nach Typumwandlung
$a === $bIdentischgleich und vom selben Typ
$a != $b, $a <> $bUngleichungleich nach Typumwandlung
$a !== $bNicht identischungleich oder verschiedene Typen
$a < $b, $a > $bKleiner als, größer als
$a <= $b, $a >= $bKleiner oder gleich, größer oder gleich
$a <=> $bSpaceshipliefert -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.

Lockerer (==) und strikter (===) Vergleich
Point at or tap a cell to read it as PHP.
$a == $btruefalse10-1"1""0"""null[]"php""10""1e1"
true
false
1
0
-1
"1"
"0"
""
null
[]
"php"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Wie == verschiedene Typen vergleicht

Die Regeln, denen PHP 8 folgt, in der Reihenfolge, in der sie in der Praxis zählen:

  1. Zwei numerische Strings werden als Zahlen verglichen: "10" == "1e1" und "1" == "01" sind beide true.
  2. Eine Zahl und ein numerischer String: Der String wird zur Zahl. 100 == "1e2" ist true.
  3. Eine Zahl und ein nicht numerischer String: Seit PHP 8 wird die Zahl zum String, und beide werden als Strings verglichen. 0 == "a" ist false (in PHP 7 war es true).
  4. Irgendetwas und ein Bool: Beide Seiten werden in bool umgewandelt. "a" == true und [] == false sind true.
  5. null und ein String: null wird zu "", also ist null == "" gleich true, aber null == "0" gleich false. Gegenüber jedem anderen Typ wird null wie false verglichen.
  6. 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.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S