…oder warum man überall wo möglich 3 Gleichheitszeichen verwenden sollte ;).
<?php $var1 = 0; $var2 = 'foobar'; var_dump($var1 == false); //true var_dump($var1 == $var2); //true var_dump($var2 == true); //true
Womit dann schlussendlich true == false gilt. qed
Haha, jetzt kommt der „PHP Klassiker“!
Na, was kommt raus?
Servus Oliver,
danke für deinen Kommentar ;). Hab grad bissl damit rumgespielt und hab die „Schallmauer“ gefunden:
2 Gleichheitszeichen:
3 Gleichheitszeichen:
$var1 = 9007199254740994;
$var2 = 9007199254740995;
var_dump($var1 === $var2); // bool(false)
$var1++;
$var2++;
var_dump($var1 === $var2); // bool(true)
Bei ner kleinen Google Recherche bin ich auf den Post hier gestoßen, der das etwas beleuchtet -> Mantissenlänge bei doubles. Was ich ja sehr verwunderlich finde, ist dass es keinen Unterschied macht ob man die beiden Variablen als String oder als double anlegt.
Ist übrigens auch wieder kein PHP-spezifisches „Problem“
Wo wir grad dabei sind ;)
var_dump(1e1 === 10); //bool(false)
Und auch der Vergleich zweier Zahlen beliebiger Genauigkeit hat seine Grenzen:
print bccomp(99999999999999,99999999999990); //not equal
print bccomp(100000000000000,100000000000001); //equal
Nein, Du musst das richtig interpretieren. :-)
Es bedeutet ja, der String sind zwar gleich, aber nicht vom gleichen Typ. :-D
Es ist schon ein PHP spezifisches Problem, weil PHP intern eine Typenkonvertierung nach integer (bzw. float wenn ein . drin ist) macht und sich dabei bei Zahlen oberhalb von 9223372036854775807 oder PHP_INT_MAX aufs Maul legt. Der Bug ist auch schon ewig gefiled, aber nun ja – irgendwie ist man da der Meinung, dass das ein gewünschtes Verhalten ist. *schulter-zuck*
Wenn man das aber nicht weiß, kann man da schon mal einen Nachmittag für die Fehlersuche opfern.
@david:
(Lieber spät als nie…)
var_dump(1e1); // float(10)
var_dump(1e1 === 10.0); // bool(true)