MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Construcțiile switch și match

Construcția switch..case este o alternativă la utilizarea construcției if..elseif..else. Operatorul switch primește o expresie și o compară cu un set de valori:

switch (expresie) {
   case valoare1: acțiuni; break;
   case valoare2: acțiuni; break;
   //...........................
   case valoareN: acțiuni; break;}

După cuvântul cheie switch, în paranteze urmează expresia care va fi comparată. Valoarea acestei expresii este comparată secvențial cu valorile plasate după operatorii case. Dacă se găsește o potrivire, se execută blocul case respectiv.

Construcția switch poate conține un număr arbitrar de operatori case. La sfârșitul fiecărui bloc case se plasează operatorul break pentru a evita executarea altor blocuri.

Întregul bloc switch este delimitat de acolade, însă blocul fiecărui operator case NU este delimitat de acolade.

De exemplu, să luăm următoarea construcție if..elseif..else:

$a = 3;
if($a == 1) echo "adunare";
elseif($a == 2) echo "scădere";
elseif($a == 3) echo "înmulțire";
elseif($a == 4) echo "împărțire";

Acum să o rescriem folosind construcția switch..case:

$a = 3;
switch($a) {
   case 1:
       echo "adunare";
       break;
   case 2:
       echo "scădere";
       break;
   case 3:
       echo "înmulțire";
       break;
   case 4:
       echo "împărțire";
       break;
}

Astfel, construcția switch primește variabila $a, iar valoarea acesteia este comparată secvențial cu valorile specificate după operatorii case. În acest caz, variabila $a este egală cu 3, astfel se va executa blocul:

case 3:
   echo "înmulțire";
   break;

Dacă dorim să tratăm și situația în care nu se găsește nicio potrivire, putem adăuga blocul default:

$a = 3;
switch($a) {
   case 1:
       echo "adunare";
       break;
   case 2:
       echo "scădere";
       break;
   default:
       echo "acțiune implicită";
       break;
}

Construcția switch..case suportă și sintaxa alternativă, în care în loc de acoladă deschisă se folosește două puncte, iar în loc de acoladă închisă se folosește cuvântul cheie endswitch:

$a = 3;
switch($a):
   case 1:
       echo "adunare";
       break;
   case 2:
       echo "scădere";
       break;
   default:
       echo "acțiune implicită";
       break;
endswitch;

Construcția match

Începând cu versiunea 8.0, PHP a adăugat suportul pentru o altă construcție similară - match. Aceasta permite optimizarea construcției switch. Construcția match primește și ea o expresie și o compară cu un set de valori.

De exemplu, să luăm următorul cod:

$a = 2;
switch($a) {
   case 1:
       $operation = "adunare";
       break;
   case 2:
       $operation = "scădere";
       break;
   default:
       $operation = "acțiune implicită";
       break;
}
echo $operation;

Rescriem acest exemplu folosind match:

$a = 2;
$operation = match($a) {
   1 => "adunare",
   2 => "scădere",
   default => "acțiune implicită",
};
echo $operation;

Construcția match primește în paranteze o expresie (în acest caz variabila $a). Blocul de cod match este, de asemenea, delimitat de acolade, dar după acolada închisă este necesar să punem punct și virgulă. În loc de operatorii case, doar se specifică valorile cu care se compară expresia.

Dar, spre deosebire de switch, construcția match returnează un rezultat. De aceea, după fiecare valoare comparată se plasează operatorul =>, urmat de rezultatul returnat.

Astfel, în acest caz, variabila $a este egală cu 2, astfel în construcția match se va executa blocul:

2 => "scădere",

Acest bloc va seta ca rezultat returnat șirul "scădere".

Deoarece construcția match returnează un rezultat, acest rezultat poate fi atribuit unei alte variabile:

$operation = match($a){
   //.................
}

În final, în variabila $operation se va stoca șirul "scădere".

De asemenea, putem rescrie exemplul anterior astfel:

$a = 2;
match($a) {
   1 => $operation = "adunare",
   2 => $operation = "scădere",
   default => $operation = "acțiune implicită",
};
echo $operation;

Compararea valorilor și tipurilor

Este important de menționat o diferență importantă între construcțiile switch și match: switch compară doar valoarea, fără a ține cont de tipul expresiei. În schimb, match ține cont și de tipul expresiei comparate. Să analizăm diferența pe un exemplu. Să considerăm următoarea construcție switch:

switch (8.0) {
 case "8.0":
   $result = "șir";
   break;
 case 8.0:
   $result = "număr";
   break;
}
echo $result; // șir

Construcția switch primește ca expresie numărul 8.0, dar din punctul de vedere al logicii interne a construcției switch, această expresie corespunde și șirului "8.0". Prin urmare, în acest caz se va executa blocul:

case "8.0":
   $result = "șir";
   break;

Acum să vedem ce se întâmplă într-un exemplu similar cu match:

match (8.0) {
 "8.0" => $result = "șir",
 8.0 => $result = "număr"
};
echo $result; // număr

Construcția match ține cont și de tipul expresiei, iar tipul în acest caz este float, prin urmare se va executa blocul:

8.0 => $result = "număr"
← Lecția anterioară Lecția următoare →