Variablen korrekt vergleichen (== vs. ===)

Die zwei Möglichkeiten, Variablen in PHP auf Gleichheit zu testen

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-Code
<?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
?>

HTML-Code: Ausgabe
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-Code
<?php
	$bool = 0;
	$bool = ($bool == false);
	$bool = ($bool == '');
	$bool = ($bool == null);
	var_dump( $bool ); // true
?>

HTML-Code: Ausgabe
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-Code
<?php
	$haystack = 'Das Haus';
	$needle = 'Das';
	// richtig waere: ===false
	if (strpos($haystack, $needle)==false) {
		echo('Nicht gefunden!');
	} else {
		echo('gefunden');
	}
?>

HTML-Code: Ausgabe
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-Code
<?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!');
	}
?>

HTML-Code: Ausgabe
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-Code
<?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!');
	}
?>

HTML-Code: Ausgabe
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.


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0