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.