PHP/Instrukcja switch: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
zamiana prognav->subst:naw
Zyx (dyskusja | edycje)
m aktualizacja formatowania
Linia 1:
{{podświetl|php}}
 
{{prognaw|PHP|[[../Instrukcja if/]]|[[../Instrukcja for/]]}}
 
Linia 6 ⟶ 4:
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. "<code>index.php?act=dodaj"</code>, "<code>index.php?act=usun"</code> itd. Możemy to zaprogramować za pomocą dużego ifa:
 
<nowikisource lang="php" line><?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';
}
</source>
 
Rozwiązanie to nie jest wygodne nie tylko ze względu na objętość takiego kodu i brak czytelności. 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:
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';
}
 
<source lang="php" line><?php
?></nowiki>
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';
}
</source>
 
W nawiasie polecenia '''switch''' definiujemy, jakiemu wyrażeniu pragniemy sprawdzić wartość. Wewnątrz nawiasów klamrowych używamy struktury <code>case wartość:</code>, 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 <code>default:</code> 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:
Rozwiązanie to nie jest wygodne nie tylko ze względu na objętość takiego kodu i brak czytelności. 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:
 
<nowikisource lang="php" line><?php
if(!isset($_GET['act']))
{
switch($_GET['act'])
$_GET['act'] = 'index';
{
}
case 'dodaj':
switch($_GET['act'])
echo 'Dodawanie danych';
{
break;
case 'edytujdod':
echo 'Jak nie damy komendy "break", to pokaże nam się też...<br/>';
echo 'Edycja danych';
case 'dodaj':
break;
echo 'Dodawanie danych';
case 'usun':
break;
echo 'Usuwanie danych';
case 'edytuj':
break;
echo 'Edycja danych';
default:
break;
echo 'Wyświetlenie danych';
case 'usun':
}
echo 'Usuwanie danych';
break;
?></nowiki>
default:
echo 'Wyświetlenie danych';
}
</source>
 
Wywołując skrypt jako <code>nazwapliku.php?act=dodaj</code>, zobaczymy:
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:
 
<nowiki><?php
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';
}
 
?></nowiki>
 
Wywołując skrypt jako ''nazwapliku.php?act=dodaj'', zobaczymy:
<span>
Dodawanie danych</span>
 
Wywołując skrypt jako ''<code>nazwapliku.php?act=dod''</code>, zobaczymy:
<span>
Jak nie damy komendy "break", to pokaże nam się też...
Linia 86:
Kod stanu może zawierać inne struktury kontrolne:
 
<nowikisource lang="php" line><?php
if(!isset($_GET['act']))
 
{
switch($_GET['act'])
$_GET['act'] = 'index';
{
}
case 'dodaj':
switch($_GET['act'])
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
{
case 'dodaj':
echo 'Dodawanie danych';
if($_SERVER['REQUEST_METHOD'] == 'POST')
}
{
else
echo 'Dodawanie danych';
{
}
echo 'Formularz dodawania';
else
}
{
break;
echo 'Formularz dodawania';
case 'edytuj':
}
echo 'Edycja danych';
break;
case 'usunedytuj':
echo 'UsuwanieEdycja danych';
break;
case 'usun':
default:
echo 'WyświetlenieUsuwanie danych';
break;
}
default:
echo 'Wyświetlenie danych';
?></nowiki>
}
</source>
 
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). ''<code>$_SERVER['REQUEST_METHOD']''</code> 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ż nie 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".