PHP == vs ===: Unterschied und warum er wichtig ist

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Die Falle, in die alle Anfänger tappen

\n\n

Stell dir vor: Du schreibst dein erstes PHP-Skript, prüfst, ob der Benutzer das richtige Passwort eingegeben hat, und verwendest die Bedingung if ($password == "secret"). Alles funktioniert einwandfrei. Aber einen Monat später bemerkst du ein seltsames Verhalten: if (0 == "off") gibt true zurück, obwohl es sich um zwei völlig verschiedene Dinge handelt. Kommt dir das bekannt vor?

\n\n

Willkommen in der Welt der PHP-Vergleichsoperatoren. Hier sind doppeltes Gleichheitszeichen (==) und dreifaches Gleichheitszeichen (===) nicht nur unterschiedliche Symbole, sondern zwei völlig verschiedene Ansätze zum Vergleichen. Wenn du den Unterschied nicht verstehst, kann sich dein Code unvorhersehbar verhalten, und Bugs verstecken sich genau dort, wo du sie am wenigsten erwartest.

\n\n

In diesem Artikel behandeln wir:

\n
    \n
  • Wie jeder Operator „von innen“ funktioniert
  • \n
  • Warum "123abc" == 123 true ergibt, aber "123abc" === 123 false
  • \n
  • Welche Fallstricke auf dich lauern (Spoiler: es gibt viele)
  • \n
  • Wann du welchen Operator in echten Projekten verwenden solltest
  • \n
\n\n

Bereit? Los geht's!

\n\n

1. Grundlagen: Was sind == und === in PHP?

\n\n

Beide Operatoren werden verwendet, um zwei Werte zu vergleichen. Aber ihr Ansatz ist grundlegend unterschiedlich.

\n\n

Der Gleichheitsoperator (==) – „Typumwandlung erlaubt“

\n

Das doppelte Gleichheitszeichen (oder loser Vergleich) wandelt zuerst beide Operanden in denselben Typ um und vergleicht dann ihre Werte. Wenn die Typen unterschiedlich sind, führt PHP automatisch eine Typumwandlung durch. Das ist praktisch, aber gefährlich.

\n\n

Der Identitätsoperator (===) – „Alles muss übereinstimmen“

\n

Das dreifache Gleichheitszeichen (oder strikter Vergleich) vergleicht sowohl die Werte als auch die Datentypen. Sind die Typen unterschiedlich, gibt es sofort false – ohne jegliche Umwandlung.

\n\n

Hier ist eine einfache Tabelle zum Merken:

\n
    \n
  • $a == $b – Sind die Werte nach Typumwandlung gleich?
  • \n
  • $a === $b – Sind die Werte gleich und stimmen die Typen überein?
  • \n
\n\n

2. Einfaches Beispiel: Zahlen und Zeichenketten

\n\n

Schauen wir uns den klassischen Fall an – den Vergleich einer Zahl mit einer Zeichenkette.

\n\n
<?php\n$a = 5;      // integer\n$b = "5";   // string\n\n// Loser Vergleich (==)\nvar_dump($a == $b);  // bool(true) – PHP wandelt den String "5" in die Zahl 5 um\n\n// Strikter Vergleich (===)\nvar_dump($a === $b); // bool(false) – Typen sind unterschiedlich: integer vs string\n?>
\n\n

Im ersten Fall denkt PHP: „Aha, eine Zahl und ein String. Den String '5' kann man leicht in die Zahl 5 umwandeln, also sind sie gleich.“ Im zweiten Fall: „Nein, integer ist nicht string, sofort false.“

\n\n

Das scheint eine Kleinigkeit zu sein. Aber genau hier beginnen die Probleme.

\n\n

3. Die Hauptfalle: „Leere“ und „Null“

\n\n

Der häufigste Fehler von Anfängern ist die Verwechslung von falsy-Werten. In PHP gibt es mehrere Werte, die bei einem losen Vergleich als gleich betrachtet werden, obwohl sie inhaltlich völlig unterschiedlich sind.

\n\n

Sieh dir diesen Code an:

\n\n
<?php\nvar_dump(0 == false);  // bool(true)  – null ist gleich false\nvar_dump(0 == null);   // bool(true)  – null ist gleich null\nvar_dump(false == null); // bool(true)  – false ist gleich null\nvar_dump("" == false); // bool(true)  – leerer String ist gleich false\nvar_dump("" == 0);     // bool(true)  – leerer String ist gleich null\n?>
\n\n

Schockiert? Kein Wunder! 0 == false ist true, "" == 0 ebenfalls true. Wenn du prüfst, ob der Benutzer ein Passwort eingegeben hat, und if ($password == "") schreibst, und dann mit if ($password == 0) vergleichst – beide Bedingungen können gleich ausgeführt werden, obwohl es unterschiedliche Szenarien sind.

\n\n

Und jetzt vergleiche mit dem dreifachen Gleichheitszeichen:

\n\n
<?php\nvar_dump(0 === false);  // bool(false)\nvar_dump(0 === null);   // bool(false)\nvar_dump("" === false); // bool(false)\nvar_dump("" === 0);     // bool(false)\n?>

Blogs

Buchempfehlungen