switch

Instrukcja switch jest podobna do serii instrukcji IF z warunkiem na to samo wyra┐enie. W wielu przypadkach istnieje potrzeba por≤wnania jednej zmiennej (lub wyra┐enia) z wieloma r≤┐nymi warto╢ciami i wykonania r≤┐nych fragment≤w kodu, w zale┐no╢ci od wyniku por≤wnania tej zmiennej z r≤┐nymi warto╢ciami. Do tego w│a╢nie s│u┐y instrukcja switch.

Poni┐ej znajduj▒ siΩ dwa przyk│ady wykonuj▒ce dok│adnie to samo, przy czym jeden z nich wykorzystuje seriΩ instrukcji if, za╢ drugi u┐ywa instrukcji switch:

if ($i == 0) {
    print "i jest r≤wne 0";
}
if ($i == 1) {
    print "i jest r≤wne 1";
}
if ($i == 2) {
    print "i jest r≤wne 2";
}

switch ($i) {
    case 0:
        print "i jest r≤wne 0";
        break;
    case 1:
        print "i jest r≤wne 1";
        break;
    case 2:
        print "i jest r≤wne 2";
        break;
}

Wa┐ne jest by zrozumieµ, jak dzia│a instrukcja switch, ┐eby unikn▒µ b│Ωd≤w. Instrukcja switch jest wykonywana linia po linii (dok│adnie wyra┐enie po wyra┐eniu). Na pocz▒tku ┐aden fragment kodu nie jest wykonywany. Dopiero kiedy zostaje odnalezione wyra┐enie case, kt≤rego warto╢µ odpowiada wyra┐eniu przy instrukcji switch, PHP rozpoczyna wykonywanie kodu od miejsca, gdzie znajduje siΩ ta instrukcja case. PHP wykonuje instrukcje a┐ do momentu kiedy blok switch siΩ sko±czy, lub do momentu znalezienia instrukcji break. Je╢li nie napiszesz instrukcji break na ko±cu instrukcji w danym wyra┐eniu case to PHP bΩdzie wykonywaµ dalej instrukcje z nastΩpnego wyra┐enia case. Na przyk│ad:

switch ($i) {
    case 0:
        print "i jest r≤wne 0";
    case 1:
        print "i jest r≤wne 1";
    case 2:
        print "i jest r≤wne 2";
}

W tym przypadku, je╢li $i jest r≤wne 0, to PHP wykona wszystkie trzy instrukcje print. Je╢li natomiast bΩdzie r≤wne jeden - wtedy tylko dwie ostatnie. Zachowanie zgodne z oczekiwaniami bΩdzie wtedy, kiedy $i bΩdzie r≤wne 2 - wtedy wykonane bΩdzie tylko ostatnia instrukcja print. Trzeba zatem pamiΩtaµ o umieszczaniu na ko±cu instrukcji break, chyba ┐e planuje siΩ wykorzystaµ jakie╢ specjalne mo┐liwo╢ci instrukcji switch, o czym dalej.

W instrukcji switch warto╢µ wyra┐enia jest obliczana tylko raz, a nastΩpnie jest por≤wnywana z ka┐dym z wyra┐e± przy etykiecie case. Natomiast w instrukcji elseif warto╢µ wyra┐enia jest obliczana ponownie. Dlatego, je╢li twoje wyra┐enie jest bardziej skomplikowane od zwyk│ego por≤wnania, lub znajduje siΩ w zwartej pΩtli (tight loop), switch mo┐e byµ szybszy.

Po etykiecie case mog▒ nie wystΩpowaµ ┐adne instrukcje, co oznacza po prostu, ┐e sterowanie zostaje przekazane do nastΩpnej etykiety case.

switch ($i) {
    case 0:
    case 1:
    case 2:
        print "i jest mniejsze od 3, ale nie jest ujemne";
        break;
    case 3:
        print "i jest r≤wne 3";
}

Specjaln▒ etykiet▒ jest etykieta warunku domy╢lnego - default. Etykieta ta dotyczy sytuacji, w kt≤rej wyra┐enie nie pasowa│o do warto╢ci przy innych etykietach typu case. W instrukcji switch ta etykieta powinna byµ ostatnia z listy. Na przyk│ad:

switch ($i) {
    case 0:
        print "i jest r≤wne 0";
        break;
    case 1:
        print "i jest r≤wne 1";
        break;
    case 2:
        print "i jest r≤wne 2";
        break;
    default:
        print "i jest r≤┐ne od 0, 1 i 2";
}

Etykieta case mo┐e zawieraµ dowoln▒ warto╢µ typu prostego, czyli liczbΩ ca│kowit▒, zmiennoprzecinkow▒ lub │a±cuch znak≤w. Tablice lub obiekty nie mog▒ byµ u┐yte, o ile nie zostan▒ przekszta│cone w jaki╢ typ prosty.

Instrukcja switch obs│uguje te┐ sk│adniΩ alternatywn▒. WiΩcej informacji na ten temat w rozdziale Sk│adnia alternatywna w strukturach kontrolnych.

switch ($i):
    case 0:
        print "i jest r≤wne 0";
        break;
    case 1:
        print "i jest r≤wne 1";
        break;
    case 2:
        print "i jest r≤wne 2";
        break;
    default:
        print "i jest r≤┐ne od 0, 1 i 2";
endswitch;