Načrtovanje in razvoj spletnih aplikacij

Pogojni stavek SWITCH

Stavek switch uporabimo takrat, ko želimo isto spremenljivko ali isti izraz primerjati z več različnimi vrednostmi in glede na ujemanje izvesti ustrezno kodo.

V sodobnem PHP je poleg stavka switch na voljo tudi izraz match. Oba pristopa služita izbiri med več možnostmi, vendar se med seboj razlikujeta v načinu primerjanja, zapisu in uporabi.

Pomni: switch uporabljamo za izbiro med več možnostmi glede na isto vrednost, match pa za podoben namen, vendar s strožjo in sodobnejšo obliko zapisa.

Osnovna pravila

  • V stavku switch se izraz ovrednoti samo enkrat.
  • Rezultat izraza se nato primerja s posameznimi vejami case.
  • Če se vejama case doda break, se izvajanje po ujemanju ustavi.
  • Če break manjka, se izvajanje lahko nadaljuje tudi v naslednje veje.
  • Veja default se izvede, če ni nobenega ujemanja.

Sintaksa stavka switch je:

switch (izraz) {
   case vrednost1:
     koda, ki se izvede, če se izraz ujema z vrednostjo1;
     break;
   case vrednost2:
     koda, ki se izvede, če se izraz ujema z vrednostjo2;
     break;
   default:
     koda, ki se izvede, če ni ujemanja;
}

Pozor: Stavek switch v PHP uporablja ohlapno primerjavo. To pomeni, da primerjanje ni enako strogi primerjavi z operatorjem ===.

Osnovni primer stavka switch

<?php
$i = 2;

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

Pomni: Ko se v stavku switch najde ustrezna veja case, se običajno uporabi break, da se izvajanje ne nadaljuje v naslednje veje.

Pomen stavka break

Ko se izvede ustrezna veja case, običajno dodamo stavek break. Ta ustavi izvajanje stavka switch. Če ga ne zapišemo, PHP nadaljuje izvajanje naslednjih vej case. Temu pravimo prelivanje oziroma fall-through.

<?php
$i = 0;

switch ($i) {
    case 0:
        echo "i je enak 0<br>";
    case 1:
        echo "i je enak 1<br>";
    case 2:
        echo "i je enak 2";
}
?>

Če je $i = 0, se v tem primeru izpišejo vse tri vrstice, ker ni nikjer zapisan break.

Pozor: Manjkajoči break je pogost razlog za nepričakovano izvajanje več vej case.

Več vrednosti za isti rezultat

Včasih želimo za več različnih vrednosti izvesti isto kodo. Takrat lahko več vej case pustimo praznih, skupno kodo pa zapišemo šele v zadnjo vejo.

<?php
$i = 1;

switch ($i) {
    case 0:
    case 1:
    case 2:
        echo "i je manjši od 3 in ni negativen";
        break;
    case 3:
        echo "i je enak 3";
        break;
}
?>

Pomni: Več vej case lahko vodi do istega rezultata, če želimo enako obdelati več različnih vrednosti.

Veja default

Poseben primer je veja default. Ta se izvede, če se izraz ne ujema z nobeno drugo vejo case. Po dogovoru jo navadno zapišemo na koncu.

<?php
$i = 5;

switch ($i) {
    case 0:
        echo "i je enak 0";
        break;
    case 1:
        echo "i je enak 1";
        break;
    case 2:
        echo "i je enak 2";
        break;
    default:
        echo "i ni enak 0, 1 ali 2";
}
?>
i ni enak 0, 1 ali 2

Pomni: Veja default je uporabna kot privzeta možnost, kadar se izraz ne ujema z nobeno drugo vrednostjo.

Izraz match

V sodobnem PHP je poleg stavka switch na voljo tudi izraz match. Podoben je stavku switch, vendar ima nekaj pomembnih razlik:

  • uporablja strogo primerjavo ===,
  • vrne vrednost,
  • se po ujemanju ne nadaljuje v naslednje veje, zato ne potrebujemo stavka break,
  • je posebej primeren za pregledno prirejanje ene vrednosti drugi.

Sintaksa izraza match je:

$rezultat = match (izraz) {
   vrednost1 => rezultat1,
   vrednost2 => rezultat2,
   default => privzeti_rezultat,
};

Primer:

<?php
$ocena = 4;

$besedilo = match ($ocena) {
    1 => "nezadostno",
    2 => "zadostno",
    3 => "dobro",
    4 => "prav dobro",
    5 => "odlično",
    default => "neveljavna ocena",
};

echo "Ocena pomeni: " . $besedilo;
?>
Ocena pomeni: prav dobro

Pozor: Izraz match uporablja strogo primerjavo, zato se njegovo obnašanje lahko razlikuje od stavka switch.

Primerjava: switch, if...elseif in match

Pristop Posebnost Primerna uporaba
switch več vej case, običajno z break primerjanje iste vrednosti z več možnostmi
if...elseif primeren za bolj splošne ali zapletene pogoje ko pogoji niso vezani le na eno vrednost
match stroga primerjava in vračanje vrednosti pregledno prirejanje ene vrednosti drugi

Pomni: switch je pregleden pri več možnih vrednostih iste spremenljivke, match pa je pogosto primernejši, ko želimo vrniti rezultat in uporabiti strogo primerjavo.

Priporočila

  • switch uporabljamo takrat, ko primerjamo isto vrednost z več možnostmi.
  • V vejah case praviloma uporabljamo break, razen kadar je prelivanje namenoma predvideno.
  • Veja default izboljša preglednost in obravnava primere brez ujemanja.
  • Za vračanje vrednosti in strogo primerjanje je v sodobni kodi pogosto primernejši match.
  • Za zapletene logične pogoje je pogosto primernejši zapis z if...elseif.

Pozor: Če je vej zelo veliko ali če pogoji niso več preprosto vezani na eno vrednost, je lahko druga struktura odločanja preglednejša od stavka switch.

Pogoste napake

  • V veji case manjka break, čeprav prelivanje ni bilo predvideno.
  • Pričakuje se stroga primerjava, čeprav switch uporablja ohlapno primerjanje.
  • Za primere brez ujemanja ni predvidena veja default.
  • Za zapletene pogoje se uporabi switch, čeprav bi bil zapis z if...elseif jasnejši.
  • Pri izrazu match se prezre dejstvo, da uporablja strogo primerjavo in vrača vrednost.

Pozor: Najpogostejši viri napak pri stavku switch so manjkajoči break, napačna pričakovanja glede primerjave in odsotnost privzete veje.

Sklep

Stavek switch je uporaben za pregledno odločanje med več možnostmi, kadar primerjamo isto spremenljivko ali isti izraz z več vrednostmi. Izraz match pa predstavlja sodobnejšo možnost za primere, kjer želimo strogo primerjanje in vračanje rezultata. Pri obeh pristopih je pomembno razumeti način primerjanja, pregledno zapisati veje in izbrati strukturo, ki najbolj ustreza nalogi.