Melvin Cowznofski: Die php Kontrollstruktur switch()

Hallo,

im php Manual steht bei der Kontrollstruktur switch():

"Erst wenn eine case Anweisung gefunden wird die dem Wert des an switch übergebenen Ausdrucks entspricht beginnt PHP tatsächlich die folgenden Anweisungen auszuführen." [...]

Dann verstehe ich nicht, wieso folgender Code zur Ausgabe von "foo" führt:

<?php  
  $var = 0;  
  switch($var)  
    {  
      case 'foo': $ausgabe = 'foo'; break;  
      case 'bar': $ausgabe = 'bar';  
    }  
  if(isset($ausgabe))  
    {  
      echo $ausgabe;  
    }  
?>

Weder der erste, noch der zweite Fall trifft zu. Deshalb würde ich hier erwarten, dass die if-Bedingung nicht greift, weil $ausgabe nicht existiert.

Kann mir bitte wer erklären, wieso dem nicht so ist? Wieso existiert $ausgabe und wieso mit dem Wert 'foo', obwohl keiner der beiden switch-Fälle zutrifft?

Mit lieben Grüßen

Melvin Cowznofski

--

Melvin Cowznofski
What – me worry?
  1. Moin,

    <?php

    $var = 0;
      switch($var)
        {
          case 'foo': $ausgabe = 'foo'; break;
          case 'bar': $ausgabe = 'bar';
        }
      if(isset($ausgabe))
        {
          echo $ausgabe;
        }
    ?>

    
    >   
    > Weder der erste, noch der zweite Fall trifft zu. Deshalb würde ich hier erwarten, dass die if-Bedingung nicht greift, weil $ausgabe nicht existiert.  
      
    beachte den Hinweis auf der Handbuchseite, die du verlinkst:  
      
    "Beachten Sie auch, dass switch/case typschwache Vergleiche durchführt."  
      
    Das bedeutet, dass PHP vor dem Vergleichen die Typen der Operanden einander angleicht. Der Operand von switch() ist in deinem Beispiel numerisch, also werden auch die einzelnen Abfragewerte in eine Zahl konvertiert. Dann wird 'foo' zu 0, und der Vergleich ist erfüllt.  
      
    Anders als bei einem Vergleich zweier Werte kann man AFAIK bei witch() keinen typsicheren Vergleich erzwingen. Also muss man als Programmierer aufpassen, dass die Typen der verwendeten Ausdrücke zueinander passen.  
      
    So long,  
     Martin  
    
    -- 
    Soso, der Klügere gibt nach.  
    Aber warum sollen sich immer nur die Dummen durchsetzen?  .oO(?)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Anders als bei einem Vergleich zweier Werte kann man AFAIK bei witch() keinen typsicheren

      ^^^^^ - hexerei - das alles

      Vergleich erzwingen. Also muss man als Programmierer aufpassen, dass die Typen der verwendeten Ausdrücke zueinander passen.

      Rainer --

      1. Hallo,

        Anders als bei einem Vergleich zweier Werte kann man AFAIK bei witch() keinen typsicheren
                                                                         ^^^^^ - hexerei - das alles

        hab ich das wirklich geschrieben? - Tatsächlich ...
        Naja, ist doch auch wahr! Ist doch wirklich alles Hexerei, Homöopathie und Alchimie!

        Ciao,
         Martin

        --
        Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
        Erfahrung bekommt man, indem man das nicht tut.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. @@Der Martin:

          nuqneH

          Naja, ist doch auch wahr! Ist doch wirklich alles Hexerei, Homöopathie und Alchimie!

          Waldorfschule, hä?

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  2. Weil php recht hat :D.

    In $var steht 0. "foo" == 0. Ergo ist $var == "foo". Demnach stimmt die erste Bedingung.
    Die erste Bedingung würde nicht mehr stimmen, wenn du nach genau dem selben suchst also $var === "foo".

    Das ist übrigens auch ein Grund wieso ich mich vor Jahren von switch verabschiedet habe und lieber else if benutze. Vor allem kann man bei else if das dumme break nicht vergessen, dass sind Fehler da kann man sich dumm und dämlich suchen.

    Gruß
    T-Rex == 1

    1. T-Rex == 1

      T-Rex++

      scnr

      --
      Signaturen sind bloed.
    2. Tach!

      T-Rex == 1

      Du schwindelst! Du bist genauso eine 0 wie alle anderen - außer 1UnitedPower.

      dedlfix.

  3. Tach!

    "Erst wenn eine case Anweisung gefunden wird die dem Wert des an switch übergebenen Ausdrucks entspricht beginnt PHP tatsächlich die folgenden Anweisungen auszuführen." [...]
    Dann verstehe ich nicht, wieso folgender Code zur Ausgabe von "foo" führt:

    Siehe PHP type comparison tables oder in Prosa bei den Typen.

    dedlfix.

  4. Hallo dedlfix, T-Rex und Der Martin!

    Bei einem Vergleich B zu A wird also der Variablentyp von B an den Variablentyp A angepasst. Das ist nachvollziehbar, daran hatte ich gar nicht gedacht.

    In meinem Fall wird also der String "foo" in einen Integerwert umgewandelt, was laut php zum Wert 0 führt. Somit ergibt sich der Treffer. Sobald ich aus dem $var = 0 ein $var = 1 mache, entsteht kein $ausgabe und es kommt somit zu keiner Ausgabe, weil 0 nicht gleich 1 ist.

    Ich denke den Herren für die schnelle Antwort!

    Mit lieben Grüßen

    Melvin Cowznofski

    --

    Melvin Cowznofski
    What – me worry?