Projektowanie stron WWW od podszewki

Kursy mojej produkcji

2.2 Instrukcja switch

W poprzedniej części kursu zapoznałem Was z instrukcjami warunkowymi if, elseif oraz else. Wszystkie kombinacje przedstawione w poprzedniej części kursu można także wykonać za pomocą instrukcji switch.
Kod:
<?php
$a 3;

if($a == 1)
{
 echo 'Raz';
}
else if($a == 2)
{
 echo 'Dwa';
}
else if($a == 3)
{
 echo 'Trzy';
}
else if($a == 4)
{
 echo 'Cztery';
}
?>
Powyższy kod można także przedstawić w inny sposób przy pomocy omawianej instrukcji.
Kod:
<?php
$a 3;

switch($a)
{
 case 1:
  echo 'Raz';
 break;

 case 2:
  echo 'Dwa';
 break;

 case 3:
  echo 'Trzy';
 break;

 case 4:
  echo 'Cztery';
 break;
}
?>
Po napotkaniu pasującej wartości dalsza część konstrukcji nie jest przerabiana przez parser. Zacznijmy od początku. Do switch() przekazujemy zmienną zwaną dalej parametrem i następnie porównujemy jej zawartość z zapisanymi opcjami, gdy w case zostanie napotkana właściwa wartość wtedy wykonuje się kod zawarty poniżej warunku. Ów kod wykonuje się do momentu napotkania break czyli przerwania bądź zakończenia instrukcji switch. Oznacza to w rezultacie, że w ostatnim przypadku (warunku) przed zakończeniem switch czyli znakiem } nie musi wystąpić break.

Na pewno zadaliście sobie pytanie czy lepiej używać konstrukcji if'o podobnych czy też switch'ów. Odpowiedz jest prosta: w zależności od sytuacji używamy konstrukcji, która najbardziej pasuje w danym momencie i jest najwygodniejsza w zastosowaniu. W późniejszej części kursu zostanie pokazane wiele przykładów stosowania obu konstrukcji.

Może zdarzyć się sytuacja, w której będziemy musieli użyć więcej niż jednego case. W takim przypadku najwygodniej jest pisać warunek pod warunkiem czyli tak jak przedstawiono poniżej:
Kod:
<?php
$a 4;

switch($a)
{
 case 1:
 case 3:
 case 5:
 case 7:
 case 9:
  echo 'Cyfra jest nieparzysta';
 break;

 case 0// Zależnie od teorii zero jest bądź nie jest parzyste
 case 2:
 case 4:
 case 6:
 case 8:
  echo 'Cyfra jest parzysta';
 break;
}
?>
Oczywiście pisanie takich warunków w nieskończoność jest głupie dlatego też jeżeli chcesz sprawdzić parzystość bądź nieparzystość podanej liczby musisz wykorzystać prostszy mechanizm. Najprostsze rozwiązanie sprawdzania parzystości poznamy w następnej części kursu, która będzie omawiać operator trójkowy.

Część z Was zapewne zastanowiła się jak powinna wyglądać instrukcja switch z warunkiem, który jest domyślny czyli przedstawia opcje else. Przypuśćmy, że skrypt wygląda tak:
Kod:
<?php
$a 3;

if($a == 1)
{
 echo 'Jeden';
}
else if($a == 2)
{
 echo 'Dwa';
}
else
{
 echo 'Inna liczba';
}
?>
W takim przypadku dla instrukcji switch przykład będzie wyglądał tak:
Kod:
<?php
$a 3;

switch($a)
{
 case 1:
  echo 'Jeden';
 break;

 case 2:
  echo 'Dwa';
 break;

 default:
  echo 'Inna liczba';
 break;
}
?>
Jak widzimy zostało zastosowane wyrażenie default oznaczające domyślną czynność jeżeli żadna z poprzednich nie została wykonana. Oczywiście tak jak wcześniej mówiłem ostatni break nie musi zostać umiejscowiony.

Różne typy zmiennych a instrukcja switch

Podczas porównywania w konstrukcji switch parametr jest automatycznie zmieniany do typu, który został podany w case. Dlatego właśnie zmienna $a spełnia pierwszy warunek.
Kod:
<?php
$a '1';

switch($a)
{
 case 1:
  echo 'Raz';
 break;

 case 2:
  echo 'Dwa';
 break;

 default:
  echo 'Coś innego';
 break;
}
?>

Łączenie warunków

Łączenie warunków niczym się nie rożni od tego w instrukcjach warunkowych typu if i wygląda następująco:
Kod:
<?php
$a 6;

switch($a)
{
 case (!empty($a) && $a 5):
  echo 'Pierwszy warunek spełniony';
 break;

 case $a 5:
  echo 'Drugi warunek spełniony';
 break;
}
?>

Ciekawostka endswitch

Istnieje alternatywny zapis instrukcji switch, w którym trzeba zastosować dodatkowo zapis endswitch informujący parser o zakończeniu instrukcji. Zwróćcie uwagę na zróżnicowany zapis.
Kod:
<?php
$a 1;

switch($a):
 case 1:
  echo 'Raz';
 break;

 case 2:
  echo 'Dwa';
 break;
endswitch;
?>
Powyższy zapis jest bardzo rzadko spotykany.

Dla osób ciekawskich proponuje usunięcie bądź zakomentowanie wszystkich break'ów w pierwszym przykładzie instrukcji switch oraz zmienienie wartości zmiennej $a na 1.