Hallo,
Jetzt hab ich aber nochmal eine Verständnissfrage:
aber bitte nicht mit Nissen.
Was ist denn der Unterschied zwischen 0, Null und false?
Oh, da sprichst du ein heißes Thema an: Datentypen und deren Unterscheidung in PHP. Um das Chaos komplett zu machen, nehmen wir noch den leeren String "" dazu.
Alle diese Werte sind im volkstümlichen Sinn "nichts", aber eben verschiedene Typen von "nichts". Das ist in PHP so schwierig zu vermitteln, weil PHP die Datentypen automatisch umwandelt, wann immer es nötig ist. Deshalb ergeben auch alle diese Ausdrücke false, wenn sie in einem boolschen Kontext (z.B. in einer if-Anweisung) stehen.
Es gibt aber Fälle, in denen man etwa zwischen dem numerischen Wert 0 und dem boolschen Wert false trotzdem unterscheiden möchte. Einige PHP-Funktionen geben nämlich im Erfolgsfall einen Zahlenwert zurück, der aber auch 0 sein kann, und im Fehlerfall ein boolsches false. In solchen Fällen reicht also die "einfache" if-Abfrage nicht.
Beispiel 1:
if (strpos($string, $id))
{ // weitere Verarbeitung
}
Dieses Beispiel versagt, wenn $id zwar gefunden wird, aber gleich am Anfang von $string. Dann ergibt strpos() nämlich 0, und das wird im boolschen Sinn von der if-Anweisung zu false umgewandelt. - Prima, denkt man sich, dann vergleiche ich halt mit false.
Beispiel 2:
if (strpos($string, $id)!=false)
{ // weitere Verarbeitung
}
Aber auch hier fallen wir in diesem Fall auf die Nase, nur dass die Verarbeitung einen Schritt komplizierter ist. Hier liefert strpos() im oben beschriebenen Fall auch 0, und der Vergleichsoperator != bringt, um den Vergleich durchführen zu können, erstmal beide Operanden auf denselebn Typ. Er wandelt also den zweiten Operanden false ebenso in den Zahlenwert 0 um, und stellt dann fest: Die Aussage 0!=0 ist nicht wahr, die Bedingung also nicht erfüllt.
Aus dem Dilemma kommen wir nur heraus, wenn wir die automatische Typumwandlung beim Vergleich unterbinden.
Beispiel 3:
if (strpos($string, $id)!==false)
{ // weitere Verarbeitung
}
So wird ein Schuh draus: Wenn strpos() jetzt irgendeinen Zahlenwert liefert, dann gilt der schon deshlab als ungleich false, weil die Typen der Operanden nicht übereinstimmen, Zahlenwert ist immer ungleich Boolean. Der Operator für typsichere Prüfung auf Gleichheit ist übrigens === (drei Gleichheitszeichen).
Was lernen wir daraus? Eine automatische Typumwandlung, wie PHP sie bei Bedarf durchführt, kann sehr bequem sein. Aber man muss in einigen Fällen höllisch aufpassen, dass man nicht auf die Nase fällt.
So long,
Martin
Einer aktuellen Erhebung zufolge sind zehn von neun Ehefrauen eifersüchtig auf ihren Mann.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(