PHP Switch/Case Konstrukt, Notice vermeiden!

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi Leute

Da ich mit Switch/Case noch nicht gearbeitet habe, aber gehört habe das es schneller sein soll und vor allem flexibler als if elseif, baue ich jetzt paar Sachen doch um.

Nun, da ich sauber programmieren möchte kommen NOTICES bei mir nicht in Frage, nun bei switch ist das aber meiner Meinung nach etwas problematisch oder? da wenn man um das Konstrukt selbst ein IF macht um die Variable zu setzen funktioniert im switch der default leider nicht mehr da ja das if drumherum greift, und ein else sucht, ohne else passiert dann nix oder es kommt eine 404.

Ein if um das switch ist dann mal auf deutsch gesagt Mist da das default in ihm praktisch lahmgelegt wird, also entweder unsauber ohne default und das IF lassen oder ....

Vor dem switch...
PHP:
$var = (isset($_GET["var"])) ? $_GET["var"] : '';
switch($var) {
...
......
}

Das ist ok, meiner Meinung nach, doch da ich kein Experte bin würde ich doch gerne genau wissen wollen ob das hier wirklich ok ist oder nur Murks ist?

Danke.
 
Bei einem switch musst du vorsichtig sein! z.b. bedeutet "case 'test'" hier das gleiche wie "if ($var == 'test')". PHP nennt das "Loose comparisons" und es führt gelegentlich zu unerwarteten Resultaten.
-> http://php.net/manual/en/control-structures.switch.php
-> http://www.php.net/manual/en/types.comparisons.php#types.comparisions-loose


Wenn man weiss was man machen will ist switch aber durchaus eine brauchbare Alternative. Allerdings sollte man wirklich dafür sorgen, dass die getestet Variable auch wirklich vom erwarteten Typ ist.


Welche NOTICES meinst du konkret wenn ich das fragen darf?
 
Hi

Sowas hier ist eine Notice: indefined index: var...., klar da die variable ja noch nicht gesetzt ist.

switch($_GET['var'] {

}

Das mit vorsichtig sein gefällt mir wieder garnicht, du meinst von wegen Code Injection oder ?
 
Die Variante ist vollkommen OK, anders bekommst du die Notice auch nicht weg. Außer du verwendest das Stück ohne Zwischenspeicherung in einer Variablen.
 
Danke @Yuuri

Noch eine Frage...wie baut man in so einem switch ein OR ein? also wenn ma nicht nur auf var sondern auch auf var2 var3 prüfen will? bei if geht das ja problemlos aber wie geht das bei nem switch? bzw. geht das überhaupt?
 
Dafür ist jeweils das break zuständig.
PHP:
if( $x == 1 ) x1();
else if( $x == 2 ) x2();
else if( $x > 2 && $x < 6 ) xo();
else xe();
ist das Gleiche wie
PHP:
switch( $x )
{
  case 1 : x1(); break;
  case 2 : x2(); break;
  case 3 :
  case 4 :
  case 5 :
    xo();
    break;
  default : xe();
}
 
Ich glaube, Belee geht es darum, anhand der Werte mehrerer Variablen zu switchen. Das geht aber nicht - dafür muß man sich mit herkömmlichen IFs behelfen.
 
PHP:
switch( $x )
{
  case 1 : x1(); break;
  case 2 : x2(); break;
  case 3 :
  case 4 :
  case 5 :
    xo();
    switch( $y )
    {
      case 1 : y1(); break;
      case 2 : y2(); break;
      case 3 :
      case 4 :
      case 5 :
        yo();
        break;
      default : ye();
    }
    break;
  default : xe();
}
Ist doch nicht viel anders.
 
jao genau sowas, nochwas, wenn der default für alle switches der selbe ist, lasse ich jetzt alle bis auf den letzten im code weg?
 
Nein natürlich nicht, denn wenn du einmal einen inneren Switch erreicht hast, so wird der von dir angesprochene, letzte Default-Teil nie mehr erreicht werden können (denn da in den inneren Switch gesprungen werden konnte musste auch ein case-statement des äußeren Switches zutreffen, was Default außen flach legt).

Nehme Yuuris Code, baue den inneren Default-Teil aus, denke dir $x = 5 und $y = 10. So würde garkeine Default-Behandlung angestoßen werden, obwohl die 10 nicht passt.
 
Zuletzt bearbeitet:
Zurück
Oben