Ralf: if($x == 'foo') macht komisches Zeug

Hi,

$x = 0;  
...  
if($x == "foo"){  
	echo "x= $x<br>";  
}

bring eine Ausgabe von "0". Er dürfte aber doch gar nicht in den if-Block gehen weil $x != "foo" ist!

  1. Hallo,

    $x = 0;

    ...
    if($x == "foo"){
    echo "x= $x<br>";
    }

    
    >   
    > bring eine Ausgabe von "0".  
      
    ja, diese verteufelte automatische Typumwandlung. Mir wäre es auch lieber, wenn PHP an der Stelle eine Fehlermeldung bringen würde, etwa "incompatible types".  
      
    Tatsächlich geht der Parser hier nach dem ersten Operanden des Vergleichs. Das ist eine Zahl. Also wird, damit der Vergleich durchgeführt werden kann, der zweite Operand ebenfalls in eine Zahl konvertiert. Der String "foo" ergibt, als Zahl interpretiert, schlicht und ergreifend 0. Also ist die Vergleichsbedingung erfüllt.  
      
    Hättest du den typsicheren Vergleich mit === verwendet, wäre alles in Butter. Dann schlägt der Vergleich nämlich schon deshalb fehl (genauer: ergibt false), weil die Typen der Operanden nicht übereinstimmen.  
      
    
    > Er dürfte aber doch ...  
      
    Wer ist "er"?  
      
    Ciao,  
     Martin  
    
    -- 
    In Ägypten haben früher 150000 Leute 35 Jahre lang an einer Pyramide gearbeitet. Aber bei uns arbeiten doppelt so viele Leute doppelt so lange allein an der Baugenehmigung.  
      (Dieter Nuhr, deutscher Kabarettist)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hättest du den typsicheren Vergleich mit === verwendet, wäre alles in Butter. Dann schlägt der Vergleich nämlich schon deshalb fehl (genauer: ergibt false), weil die Typen der Operanden nicht übereinstimmen.

      Danke.

      Wer ist "er"?

      Na der kombjuder!

    2. Tach!

      Tatsächlich geht der Parser hier nach dem ersten Operanden des Vergleichs. Das ist eine Zahl.

      Wobei die Betonung auf "hier" liegen muss, denn wenn man die Operanden tauscht, ist das Ergebnis nicht anders. Es gewinnt allgemein gesagt nicht der erste Operand, sondern der Integer gegenüber dem String. Siehe auch Type comparison tables.

      dedlfix.

      1. Hallo,

        Tatsächlich geht der Parser hier nach dem ersten Operanden des Vergleichs. Das ist eine Zahl.
        Wobei die Betonung auf "hier" liegen muss, denn wenn man die Operanden tauscht, ist das Ergebnis nicht anders. Es gewinnt allgemein gesagt nicht der erste Operand, sondern der Integer gegenüber dem String.

        danke für die Ergänzung. Mir ist das Versäumnis aufgefallen, als ich das Posting schon abgeschickt hatte, fand es aber nicht schwerwiegend genug, um nochmal nachzusetzen.

        Siehe auch Type comparison tables.

        Wow. Diese Übersicht hatte ich auch noch nicht gefunden (aber auch nicht gezielt gesucht).

        Ciao,
         Martin

        --
        Man sollte immer wissen was man sagt
         - aber auf keinen Fall alles sagen, was man weiß.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(