Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

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.