PHP WTF #4

…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

Weitere Posts:

Dieser Beitrag wurde unter php, PHP-WTF, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

7 Antworten auf PHP WTF #4

  1. Oliver sagt:

    Haha, jetzt kommt der „PHP Klassiker“!

    < ?php $var1 = "10000000000000000000000002"; $var2 = "10000000000000000000000003"; var_dump($var1 == $var2); var_dump($var1 === $var2); ?>

    Na, was kommt raus?

  2. david sagt:

    Servus Oliver,

    danke für deinen Kommentar ;). Hab grad bissl damit rumgespielt und hab die „Schallmauer“ gefunden:

    2 Gleichheitszeichen:


    < ?php $var1 = 9007199254740991; $var2 = 9007199254740992; var_dump($var1 == $var2); // bool(false) $var1++; $var2++; var_dump($var1 == $var2); // bool(true)

    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.

  3. david sagt:

    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

  4. Oliver sagt:

    Nein, Du musst das richtig interpretieren. :-)

    < ?php $var1 = "10000000000000000000000002"; $var2 = "10000000000000000000000003"; var_dump($var1 == $var2); // bool(true); var_dump($var1 === $var2); // bool(false) ?>

    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.

  5. Pingback: Best-of-the-Web 5 | davblog: webdev and stuff

  6. Z4ppy sagt:

    @david:
    (Lieber spät als nie…)

    var_dump(1e1); // float(10)
    var_dump(1e1 === 10.0); // bool(true)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.