PHP/Instrukcja switch

< PHP
Poprzedni rozdział: Instrukcja if
Następny rozdział: Instrukcja for

Instrukcja switch

edytuj

Instrukcja switch zwana jest także instrukcją wyboru. Jej działanie jest podobne do szczególnego przypadku poznanej ostatnio instrukcji warunkowej. Pokażemy to na przykładzie.

Nietrudno znaleźć witryny internetowe, które w jednym pliku grupują kilka różnych zadań wykonywanych w zależności od parametru, np. index.php?act=dodaj, index.php?act=usun itd. Możemy to zaprogramować za pomocą dużego ifa:

<?php
if($_GET['act'] == 'dodaj')
{
   echo 'Dodawanie danych';
}
elseif($_GET['act'] == 'edytuj')
{
   echo 'Edycja danych';
}
elseif($_GET['act'] == 'usun')
{
   echo 'Usuwanie danych';
}
else
{
   echo 'Wyświetlanie danych';
}

Rozwiązanie to nie jest wygodne nie tylko ze względu na objętość takiego kodu, ale również czytelność. Przypuśćmy, że z jakiegoś powodu musimy zmienić miejsce, z którego pobieramy informację o akcji. Trzeba to zrobić w czterech miejscach, a tych może być w teorii jeszcze więcej. Znacznie łatwiejszą w użyciu, a przy tym wydajniejszą alternatywą jest instrukcja switch. Działa ona w ten sposób, że wybiera spośród dostępnego zbioru określoną wartość na podstawie wartości pewnego wyrażenia i wykonuje zdefiniowany dla niej kod. Przepiszmy raz jeszcze powyższy przykład:

<?php
if(!isset($_GET['act']))
{
   $_GET['act'] = 'index';
}
switch($_GET['act'])
{
   case 'dodaj':
      echo 'Dodawanie danych';			
      break;
   case 'edytuj':
      echo 'Edycja danych';
      break;
   case 'usun':
      echo 'Usuwanie danych';
      break;
   default:
      echo 'Wyświetlenie danych';	
}

W nawiasie polecenia switch definiujemy, jakiemu wyrażeniu pragniemy sprawdzić wartość. Wewnątrz nawiasów klamrowych używamy struktury case wartość:, aby zdefiniować dopuszczalne wartości, czyli stany wyrażenia. Po dwukropku piszemy odpowiedni kod. Jeżeli żaden ze stanów nie spełnia naszych oczekiwań, istnieje także klauzula default: pisana na samym końcu opisująca domyślne zachowanie. Jej już nie musimy dodawać, jeżeli tego nie potrzebujemy, niemniej często się ona przydaje. Zwróć uwagę na komendę break; stojącą na końcu każdego kodu przypisanego do case. Mówi ona, że wykonywanie przerywane jest w tym miejscu i PHP ma skoczyć do końca switcha, a nie przypadkiem wykonać kolejny stan. Taka oryginalna budowa wynika z jednego prostego powodu: jeżeli chcemy dla trzech różnych stanów wykonać to samo zadanie, po prostu piszemy pod rząd trzy case'y, potem kod i na końcu przerwanie. W powyższym przykładzie dodaliśmy alternatywną nazwę pierwszej akcji: "dod". Kod po przeróbkach wygląda tak:

<?php
if(!isset($_GET['act']))
{
   $_GET['act'] = 'index';
}
switch($_GET['act'])
{
   case 'dod':
      echo 'Jak nie damy komendy "break", to pokaże nam się też...<br/>';
   case 'dodaj':
      echo 'Dodawanie danych';			
      break;
   case 'edytuj':
      echo 'Edycja danych';
      break;
   case 'usun':
      echo 'Usuwanie danych';
      break;
   default:
      echo 'Wyświetlenie danych';	
}

Wywołując skrypt jako nazwapliku.php?act=dodaj, zobaczymy:

Dodawanie danych

Wywołując skrypt jako nazwapliku.php?act=dod, zobaczymy:

Jak nie damy komendy "break", to pokaże nam się też...
Dodawanie danych

PHP wykonał zarówno stan "dod", jak i następujący po nim "dodaj", gdyż w tym pierwszym brakowało komendy break.

Kod stanu może zawierać inne struktury kontrolne:

<?php
if(!isset($_GET['act']))
{
   $_GET['act'] = 'index';
}
switch($_GET['act'])
{
   case 'dodaj':
      if($_SERVER['REQUEST_METHOD'] == 'POST')
      {
         echo 'Dodawanie danych';
      }
      else
      {
          echo 'Formularz dodawania';
      }
      break;
   case 'edytuj':
      echo 'Edycja danych';
      break;
   case 'usun':
      echo 'Usuwanie danych';
      break;
   default:
      echo 'Wyświetlenie danych';	
 }

Tutaj dodaliśmy instrukcję if, która sprawdza, czy żądanie nadeszło do nas z formularza HTTP, który należy przetworzyć, czy normalnie (wtedy wyświetlamy formularz). $_SERVER['REQUEST_METHOD'] zawiera nazwę metody, za pomocą której odbyło się żądanie HTTP.

Instrukcję switch warto stosować, kiedy wybieramy konkretną możliwość z określonego w kodzie zbioru. Dla PHP zaletą jest, że "wie", jakie są wszystkie stany. Instrukcja warunkowa if jest bardziej ogólna i tam interpreter sprawdza po prostu po kolei wszystkie warunki, aż natrafi na pasujący, nie zagłębiając się w jakieś większe zależności między danymi. Switcha nie należy używać, kiedy mamy tylko dwa stany, gdyż takie zagranie przypominałoby wytoczenie haubicy do zabicia komara. Instrukcja ta nie sprawdza się także przy wszystkich bardziej ogólnych warunkach rodzaju "mniejszy, większy".