1. Allgemeines Verhalten von "=="
In den meisten Programmiersprachen prüft der Vergleichsoperator (==) zum einen den Datentyp und zum anderen den Inhalt der Variable auf Gleichheit. Der standardmäßige Vergleichsoperator (==) in PHP verhält sich anders. Dieser versucht, vor dem Vergleich beide Variablen in einen gleichen Datentyp umzuwandeln und prüft erst dann ob der Inhalt dieser Variablen gleich ist. So ergeben sich nachfolgende Ergebnisse:
<?php var_dump( 1 == 1 ); // true var_dump( 1 == 2 ); // false var_dump( 1 == '2' ); // false var_dump( 1 == '1' ); // true var_dump( 1 == true ); // true var_dump( 1 == false ); // false ?>
bool(true) bool(false) bool(false) bool(true) bool(true) bool(false)
Dieses Verhalten sollte bei Verwendung von "==" immer im Hinterkopf behalten werden. Insbesondere sei darauf hingewiesen, dass (int)0, (bool)false, (string)'', (string)'0' und NULL alle als gleich angesehen werden (kurioserweise aber nicht (float)0.0):
<?php $bool = 0; $bool = ($bool == false); $bool = ($bool == ''); $bool = ($bool == null); var_dump( $bool ); // true ?>
bool(true)
2. Verhalten von "==" am Beispiel strpos
Dies ist unbedingt zu beachten bei Funktionen, die z.B. sowohl einen Integerwert von (int)0 bis (int)n als auch den Wert (bool)false zurückgeben können. strpos($haystack, $needle) ist dafür ein Beispiel. Wird der String $needle in $haystack gefunden, dann gibt strpos dessen Position zurück, welche auch (int)0 sein kann (der String steht dann direkt am Anfang des $haystack-Strings). Wird $needle hingegen nicht gefunden, dann wird (bool)false zurückgegeben. Folgender Code ist daher falsch:
<?php $haystack = 'Das Haus'; $needle = 'Das'; // richtig waere: ===false if (strpos($haystack, $needle)==false) { echo('Nicht gefunden!'); } else { echo('gefunden'); } ?>
Nicht gefunden!
Im obigen Code wird immer „Nicht gefunden!” ausgegeben, da (bool)false und (int)0 als gleichwertig angesehen werden. Nachfolgende beide Code-Abschnitte sind äquivalent dazu und daher ebenfalls falsch:
<?php $haystack = 'Das Haus'; $needle = 'Das'; // erzeugt immer "nicht gefunden" if (!strpos($haystack, $needle)) { echo('Nicht gefunden!'); } else { echo('gefunden'); } // erzeugt ebenfalls immer "nicht gefunden" if (strpos($haystack, $needle)!=false) { echo('gefunden'); } else { echo('Nicht gefunden!'); } ?>
Nicht gefunden!Nicht gefunden!
3. Verhalten von "===" am Beispiel strpos
Will man diese Probleme umgehen, dann muss der Operator "===" (bzw. die Negation "!==") verwendet werden. Dieser prüft auch den Datentyp der Variablen und gibt nur dann (bool)true zurück, wenn beide Variablen den selben Inhalt und den selben Datentyp haben. Folgendes wäre daher korrekt:
<?php $haystack = 'Das Haus'; $needle = 'Das'; if (strpos($haystack, $needle)===false) { echo('Nicht gefunden!'); } else { echo('gefunden'); } // aequivalent und ebenfalls korrekt if (strpos($haystack, $needle)!==false) { echo('gefunden'); } else { echo('Nicht gefunden!'); } ?>
gefundengefunden
Damit ist "===" das "==" wie man es aus vielen anderen Programmiersprachen kennt. Es sollte nach Möglichkeit immer "===" (bzw. "!==") verwendet werden — und nicht "==" und "!=", da erstere nicht durch Missachtung der Datentypen zu unerwartetem Verhalten führen können.