Forum und email

switch

A switch kifejezés hasonló egy sereg IF kifejezéshez, ahol a kifejezésekben ugyanaz szerepel. [Pont olyan, mint a C-ben, C-s gyakorlattal rendelkezőknek Tovább gomb]. Gyakori, hogy ugyanazt a változót (vagy kifejezést) kell ö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 erre való a switch.

Note: Néhány más nyelvvel ellentétben, a continue utasítás használható switch-ben és ugyanúgy működik mint a break. Ha van egy switch-et egy cikluson belül, és a ciklusban szeretnél továbblépni, a continue 2 parancsot kell kiadnod.

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

Example#1 A switch szerkezet

<?php
if ($i == 0) {
    echo 
"i most 0";
} elseif (
$i == 1) {
    echo 
"i most 1";
} elseif (
$i == 2) {
    echo 
"i most 2";
}

switch (
$i) {
case 
0:
    echo 
"i most 0";
    break;
case 
1:
    echo 
"i most 1";
    break;
case 
2:
    echo 
"i most 2";
    break;
}
?>

Example#2 A switch szerkezetben használhatók stringek

<?php
switch ($i) {
case 
"alma":
    echo 
"i most: alma";
    break;
case 
"bigyo":
    echo 
"i most: bigyo";
    break;
case 
"torta":
    echo 
"i most: torta";
    break;
}
?>

A hibák elkerülése végett fontos megérteni, hogy hogyan kerül végrehajtásra a switch szerkezet. A switch vagyis utasításról utasításra hajtódik végre. 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. Ezután 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 nincs break egy case-hez tartozó utasítás(sorozat) végén, akkor a PHP végrehajtja a soron következő case-hez tartozó utasításokat is! Például:

<?php
switch ($i) {
    case 
0:
        echo 
"i most 0";
    case 
1:
        echo 
"i most 1";
    case 
2:
        echo 
"i most 2";
}
?>

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

A switch kifejezésben a feltétel csak egyszer értékelődik ki és a kapott eredmény lesz összehasonlítva 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 (case) utasításlistája üres is lehet, így a vezérlés a következő case-címkére adódik.

<?php
switch ($i) {
case 
0:
case 
1:
case 
2:
    echo 
"i 3-nál kisebb, de nem negatív";
    break;
case 
3:
    echo 
"i pont 3";
}
?>

Egy különleges eset a default [alapértelmezett] címke. Ez a címke bármivel egyezik, amivel a korábbi case elemek nem egyeztek. Ennek kell az utolsó elemnek lennie. Például:

<?php
switch ($i) {
case 
0:
    echo 
"i most 0";
    break;
case 
1:
    echo 
"i most 1";
    break;
case 
2:
    echo 
"i most 2";
    break;
default:
    echo 
"i se nem 0, se nem 1, se nem 2";
}
?>

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, csakis 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.

<?php
switch ($i):
case 
0:
    echo 
"i most 0";
    break;
case 
1:
    echo 
"i most 1";
    break;
case 
2:
    echo 
"i most 2";
    break;
default:
    echo 
"i se nem 0, se nem 1, se nem 2";
endswitch;
?>