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.
Poprzedni | Spis tre╢ci | NastΩpny |
continue | Pocz▒tek rozdzia│u | declare |