Ankündigung

Einklappen
Keine Ankündigung bisher.

switch-Wunder? Kopf raucht! Bahnhof!!

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • switch-Wunder? Kopf raucht! Bahnhof!!

    Hi,

    folgender Code:
    PHP-Code:
    <?php
        
    public function transform($key$value)
        {
            list (
    $line$colname) = $key;    
            switch (
    $colname) {
            case 
    'hu':
            case 
    'au':
            case 
    'ez':
                
    // input(mm.yyyy) -> output(yyyy-mm-01)
                
    var_dump("328§&%§/§VSFW"$colnamegettype($colname)); exit;
    ?>
    Folgende Ausgabe:
    Code:
    string(16) "328§&%§/§VSFW" int(0) string(7) "integer"
    Ist das ein Bug? Die komischen Zeichen im 1. Parameter von var_dump() sind nur zur Versicherung, dass ich mich auch wirklich im richtigen Codeblock befinde (denke diese Debug-Ausgabe ist also eindeutig).

    Wie kann es sein, dass $colname = 0 ist, wenn doch eindeutig nur die case 'hu', 'au' und 'ez' in diesen switch-Block gelangen dürfen?

    Mal abgesehen davon, das Ergebnis ist reproduzierbar:
    PHP-Code:
    <?php
    $colname 
    0;
    switch (
    $colname) {
    case 
    'hu':
    case 
    'au':
    case 
    'ez':
        
    var_dump($colname);
        break;
    }
    ?>
    Darf ein in switch abgeprüftes Elemente nicht 0 oder FALSE sein? Seit wann das denn?!


  • #2
    Hm Auto-Typecast offenbar, (int)0 === (int)(string)'hu'
    Jetzt muss ich nurnoch herausfinden, warum eine Spalte den Namen 0 hat.

    Kommentar


    • #3
      Hab die Geschichte gerade auch in den User Notes gefunden
      http://de3.php.net/manual/en/control...itch.php#59991

      php wandelt wohl die case Werte in den Typ der in switch () angegeben Variable um. Und (int) von jeglichem String, der keine Ziffer beinhaltet ist dann 0.

      Für alle Fauzlpelze, die Lösung für obiges Problem wäre dann:
      PHP-Code:
      <?php
      switch($colname
        {
        case 
      $colname === 'hua':
        case 
      $colname === 'au':
        case 
      $colname === 'ez':
          
      // ... do something useful
        
      }
      ?>
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Zitat von nikosch77
        Hab die Geschichte gerade auch in den User Notes gefunden
        http://de3.php.net/manual/en/control...itch.php#59991

        php wandelt wohl die case Werte in den Typ der in switch () angegeben Variable um.
        Aua! So ein Mist!
        Es wäre doch viel logischer, die Variable auf den Typ der Cases umzuwandeln.
        Sonst kann man switch doch nie in Funktionen brauchen, wo nicht ganz sicher ist, welcher Typ übergeben wird.
        (string) von 0 wäre '0' und es gäbe kein Problem.

        Zitat von nikosch77
        Und (int) von jeglichem String, der keine Ziffer beinhaltet ist dann 0.

        Für alle Fauzlpelze, die Lösung für obiges Problem wäre dann:
        PHP-Code:
        <?php
        switch($colname
          {
          case 
        $colname === 'hua':
          case 
        $colname === 'au':
          case 
        $colname === 'ez':
            
        // ... do something useful
          
        }
        ?>
        Das ergibt doch
        PHP-Code:
        <?
        case false:
        case false:
        case false:
        //...
        ?>
        Wie wäre es mit
        PHP-Code:
        <?
        switch (strval($colname))
        ?>
        **********************************
        Nein, ich bin nicht die Signatur.
        Ich putze hier nur.
        **********************************

        Kommentar


        • #5
          Es soll ja auch false ergeben. Dass der case durchlaufen wird, ist doch der Fehler. Und sorry, es muß natürlich
          Code:
           case 'hu':
          statt 'hua' heißen. Nicht, dass Zerglings komplizierte Methode plötzlich nicht mehr funktioniert...

          EDIT:
          zu früh gefreut. Das ist ja schon dreist:

          PHP-Code:
          <?

          function switchtest ($test)
            {
            switch ($test) {

              case $test === 'hua':
                echo 'hua-he';
                break;

              case $test === '0':
                echo '0';
                break;

              case (string) $test === '1':
                echo '1';
                break;

              case $test === '2':
              case $test === 2:
                echo '2';
                break;

              default:
                echo 'failed';
              }
            }

          switchtest ('he');  // failed
          switchtest ('hua'); // hua-he
          switchtest (0);     // hua-he
          switchtest ('0');   // hua-he
          switchtest (1);     // 1
          switchtest ('1');   // 1
          switchtest (2);     // 2
          switchtest ('2');   // 2

          ?>
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Ne also Vergleiche schreib ich in switch/case Blöcke nich noch rein. War aber auch ein Fehler, dass plötzlich ein Integer reingeschlüpft ist. Wenigstens hab ich ihn dann so gefunden und langsam dämmerts auch wieder, dass ich das Problem eigentlich schon kannte.
            Danke euch!

            Kommentar


            • #7
              Ok, lesen hilft. Offenbar gehört in switch () ein true, wenn die cases mit Bedingungen erweitert werden. Das ist dann wirklich nur noch ein anders geschriebenes If-Statement.
              Fürs obige Beispiel:
              PHP-Code:
              <?
              function switchtest ($test)
                {
                switch (true) {

                  case ($test === 'hua'):
                    echo 'hua-he';
                    break;

                  case ($test === '0'):
                    echo '0';
                    break;

                  case ((string) $test === '1'):
                    echo '1';
                    break;

                  case ($test === '2'):
                  case ($test === 2):
                    echo '2';
                    break;

                  default:
                    echo 'failed';
                  }
                }

              switchtest ('he');  // failed
              switchtest ('hua'); // hua-he
              switchtest (0);     // failed
              switchtest ('0');   // 0
              switchtest (1);     // 1
              switchtest ('1');   // 1
              switchtest (2);     // 2
              switchtest ('2');   // 2

              ?>
              Alles richtig, aber Thema verfehlt. Setzen!
              .
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Zitat von nikosch77
                Es soll ja auch false ergeben. Dass der case durchlaufen wird, ist doch der Fehler. Und sorry, es muß natürlich
                Code:
                 case 'hu':
                statt 'hua' heißen. Nicht, dass Zerglings komplizierte Methode plötzlich nicht mehr funktioniert...
                Neee. So wird das nix.

                Wenn die Variable 0 enthält, wird ja jeder Case durchlaufen, weil 0 ja dem Wert im case (=false) entspricht.

                EDIT:
                Zwischendurch mal ein Refresh ist auch nicht schlecht...
                Bin ja viiiiiel zu spät dran.
                **********************************
                Nein, ich bin nicht die Signatur.
                Ich putze hier nur.
                **********************************

                Kommentar

                Lädt...
                X