Einleitung: Die Falle, in die alle Anfänger tappen
\n\nStell 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?
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\nIn diesem Artikel behandeln wir:
\n- \n
- Wie jeder Operator „von innen“ funktioniert \n
- Warum
"123abc" == 123true ergibt, aber"123abc" === 123false \n - Welche Fallstricke auf dich lauern (Spoiler: es gibt viele) \n
- Wann du welchen Operator in echten Projekten verwenden solltest \n
Bereit? Los geht's!
\n\n1. Grundlagen: Was sind == und === in PHP?
\n\nBeide Operatoren werden verwendet, um zwei Werte zu vergleichen. Aber ihr Ansatz ist grundlegend unterschiedlich.
\n\nDer Gleichheitsoperator (==) – „Typumwandlung erlaubt“
\nDas 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\nDer Identitätsoperator (===) – „Alles muss übereinstimmen“
\nDas 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\nHier 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
2. Einfaches Beispiel: Zahlen und Zeichenketten
\n\nSchauen 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\nIm 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\nDas scheint eine Kleinigkeit zu sein. Aber genau hier beginnen die Probleme.
\n\n3. Die Hauptfalle: „Leere“ und „Null“
\n\nDer 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\nSieh 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\nSchockiert? 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.
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?>