switch

A switch kifejezés hasonló egy sereg IF kifejezéshez, ahol a kifejezésekben ugyanaz szerepel. [Pont olyan, mint a C-beli, C-s gyakorlattal rendelkezőknek Tovább gomb]. Sokszor fordul elő, hogy ugyanazt a változót (vagy kifejezést) szeretnéd összehasonlítani több különböző értékkel, és más-más kódot végrehajtani a változó (kifejezés) értékétől függően. Pontosan ez az, amire a switch való.

Az alábbi két példa két különböző módon írja ki ugyanazt, az egyik egy sor if kifejezést használ, a másik pedig a switch-et:

  1 
  2 
  3 if ($i == 0) {
  4     print "i most 0";
  5 }
  6 if ($i == 1) {
  7     print "i most 1";
  8 }
  9 if ($i == 2) {
 10     print "i most 2";
 11 }
 12  
 13 switch ($i) {
 14     case 0:
 15         print "i most 0";
 16         break;
 17     case 1:
 18         print "i most 1";
 19         break;
 20     case 2:
 21         print "i most 2";
 22         break;
 23 }
 24 
 25      

A hibák elkerülése végett fontos megérteni, hogy hogyan hajtódik végre a switch szerkezet. A switch sorról-sorra hajtódik végre (vagyis utasításról utasításra). Nem hajtódik végre semmilyen utasítás, csak akkor, ha egy olyan case kifejezést talál a PHP, amely egyezik a switch kifejezés értékével. A PHP addig folytatja az utasítások végrehajtását, amíg el nem éri a switch blokk végét, vagy nem találkozik egy break utasítással. FONTOS!!! Ha nem írsz break-et a case kifejezés végére, a PHP folytatni fogja a végrehajtást akkor is, ha újabb case jön! Például:

  1 
  2 
  3 switch ($i) {
  4     case 0:
  5         print "i most 0";
  6     case 1:
  7         print "i most 1";
  8     case 2:
  9         print "i most 2";
 10 }
 11 
 12      

Itt, ha $i 0, a PHP az összes kiíró utasítást végrehajtja! Ha $i 1, a PHP az utolsó két sort hajtja végre, és csak ha $i értéke 2, akkor kapod a 'kívánt' eredményt (csak i most 2 íródik ki). Tehát nagyon fontos nem elfelejteni a break utasítást (bár lehet, hogy szándékosan elhagyod bizonyos körülmények között).

A switch kifejezésben a feltétel csak egyszer értékelődik ki és az eredmény hasonlítódik össze a case kifejezések mindegyikével. Ha elseif kifejezéseket használsz, a kifejezések újra és újra kiértékelődnek. [és újra és újra be kell gépelni. Ez nem csak fárasztó, de hiba forrása is lehet.] Ha a kifejezés bonyolult, vagy egy ciklus belsejében van, a switch a gyorsabb.

Egy eset utasításlistája üres is lehet, így a vezérlés a következő case-címkére adódik.

  1 
  2 
  3 switch ($i) {
  4     case 0:
  5     case 1:
  6     case 2:
  7         print "i 3-nál kisebb, de nem negatív";
  8         break;
  9     case 3:
 10         print "i pont 3";
 11 }
 12 
 13      

Egy különleges eset a default [alapértelmezett] címke. Ez a címke mindennel egyezik. Például:

  1 
  2 
  3 switch ($i) {
  4     case 0:
  5         print "i most 0";
  6         break;
  7     case 1:
  8         print "i most 1";
  9         break;
 10     case 2:
 11         print "i most 2";
 12         break;
 13     default:
 14         print "i se nem 0, se nem 1, se nem 2";
 15 }
 16 
 17      

A case kifejezés tetszőleges kifejezés, aminek egyszerű a típusa, vagyis egész vagy lebegőpontos szám, vagy string. Tömbök és objektumok itt nem használhatók, hacsak nem egy-egy elemük ill. változójuk egyszerű típusként.

Az alternatív szintaxis működik a switch-ekkel is. Bővebb információért lásd: Vezérlési szerkezetek alternatív szintaxisa.

  1 
  2 
  3 switch ($i):
  4     case 0:
  5         print "i most 0";
  6         break;
  7     case 1:
  8         print "i most 1";
  9         break;
 10     case 2:
 11         print "i most 2";
 12         break;
 13     default:
 14         print "i se nem 0, se nem 1, se nem 2";
 15 endswitch;
 16 
 17