W skryptach PHP często trzeba podejmować decyzje na podstawie warunków. Na przykład, jeśli użytkownik nie podał w formularzu internetowym adresu e-mail, to wyświetlamy komunikat, że adres e-mail jest obowiązkowy. Albo jeśli użytkownik jest administratorem, to wpuszczamy go do panelu administracyjnego.
Do wyrażania tego rodzaju intencji służą konstrukcje warunkowe. PHP ma trzy takie konstrukcje: instrukcję if
(i jej warianty z dodatkiem else
), instrukcję switch
i wyrażenie PHP match
(nowość dodana w PHP 8). Czy ci się to podoba, czy nie, w tym rozdziale nauczysz się używać każdej z tych konstrukcji.
Co gorsza, poznasz odpowiedzi między innymi na następujące pytania:
- Czym są instrukcje sterujące?
- Czym są instrukcje wyboru?
- Czym są rozgałęzienia w programowaniu?
- Co to jest kod spaghetti?
Zaczniemy od odpowiedzi na pierwsze pytanie, ponieważ ma najbardziej ogólny charakter.
Instrukcje sterujące w PHP
W rozdziale wprowadzającym do operatorów PHP napisałem, że można je porównać do mokrych składników ciasta, które spajają wszystkie suche składniki (zmienne, stałe, literały). Jeśli tak, to instrukcje sterujące są jak mikser, za pomocą którego te wszystkie składniki możemy wymieszać.
Instrukcje sterujące PHP służą więc do sterowania wykonywaniem programu. Pozwalają robić to na dwa sposoby, dlatego dzieli się je na dwie grupy: instrukcje warunkowe (nazywane też instrukcjami wyboru albo rozgałęzieniami) i instrukcje iteracyjne (nazywane też pętlami).
W tym rozdziale poznasz instrukcje warunkowe PHP, dzięki czemu nauczysz się wykonywać różne instrukcje lub bloki instrukcji w zależności do tego, czy zostały spełnione określone warunki.
Z kolei pętle umożliwiają wielokrotne wykonywanie różnych działań. Jednak nimi zajmiemy się w następnym rozdziale.
Teraz zapraszam cię do zapoznania się z jedną z najczęściej używanych instrukcji warunkowych w wielu językach programowania: instrukcji PHP if
.
Instrukcja warunkowa PHP if
Instrukcja PHP if wykonuje określoną instrukcję, jeśli zostanie spełniony pewien warunek. Warunek ten należy wpisać w nawiasie po słowie kluczowym if
, a instrukcję do ewentualnego wykonania zaraz za tym nawiasem, np.:
if ($a > 5)
echo "Liczba $a jest większa od 5.";
Jeśli zmienna $a będzie miała wartość większą od 5
, to skrypt wyświetli na stronie napis "Liczba $a jest większa od 5."
(dzięki interpolacji zmiennych PHP w miejscu zmiennej $a znajdzie się jej wartość).
Ogólna postać tej instrukcji wygląda następująco:
if (wyrażenie-warunkowe) instrukcja-do-wykonania
Można też przedstawić ją wizualnie w formie diagramu:

W instrukcjach warunkowych to, co znajduje się w nawiasie, jest traktowane jako wyrażenie logiczne, czyli zwracające wartość true
lub false
.
A zatem w omawianej instrukcji, jeśli wyrażenie warunkowe ma wartość true
(warunek jest spełniony), następuje wykonanie najbliższej instrukcji.
Jeśli natomiast wyrażenie warunkowe ma wartość false
(warunek nie jest spełniony), to najbliższa instrukcja nie jest wykonywana.
Oczywiście wyrażenie warunkowe można rozbudować. Do tworzenia takich rozbudowanych wyrażeń służą między innymi operatory porównań PHP i operatory logiczne PHP. Spójrz na poniższy przykład:
if ($a > 5 && $a < 20)
echo "Liczba $a jest większa od 5, ale mniejsza od 20.";
Tutaj sprawdzamy, czy zmienna $a jest większa od 5
i mniejsza od 20
. I jeszcze jeden przykład:
if ($a === 5 || $a === 8)
echo 'Zmienna $a ma wartość 5 lub 8.';
A w tym przypadku, gdy wartością zmiennej $a będzie liczba całkowita 5
lub 8
, to się o tym dowiemy.
Tak wygląda najprostsza możliwa forma instrukcji PHP if
. Pozwala ona na wykonanie tylko jednej instrukcji, kiedy zostanie spełniony określony warunek.
Jeśli w razie spełnienia warunku chcesz wykonać kilka instrukcji, to możesz skorzystać z instrukcji if
z blokiem kodu w klamrze. Oto jej podstawowa składnia:
if (wyrażenie-warunkowe) { blok-instrukcji; }
Powiedzmy na przykład, że chcemy sprawdzić, czy zmienna o określonej nazwie jest zdefiniowana oraz czy zawiera wartość typu int
. Jeśli jedno i drugie jest prawdą, to chcemy tę wartość wyświetlić, a następnie chcemy ją zwiększyć o jeden:
if (isset($a) && is_int($a)) {
echo $a;
$a++;
}
A teraz pokażę ci bardziej praktyczny przykład użycia ten instrukcji. Instrukcja PHP if
ma bardzo przyjemną cechę, która pozwala na wygodne wplatanie w nią kodu HTML.
Wplatanie kodu HTML w instrukcję if
W języku PHP wszystko tak naprawdę kręci się wokół HTML, o czym świadczy sama nazwa tego języka (przypomnę, że brzmi ona Hypertext Preprocessor, czyli Preprocesor Hipertekstu — a hipertekstem fachowo nazywa się dokument HTML).
W związku z powyższym wiele skryptów PHP stanowi mieszaninę kodu PHP i HTML. Powiedzmy na przykład, że tworzymy stronę internetową opartą na systemie WordPress.
Użytkownik tego systemu może przesłać do niego obraz graficzny, aby został on wyświetlony na górze wpisu, dokładnie tak, jak na górze tej strony. Skrypt obsługujący tę funkcję sprawdza, czy do danego wpisu jest przypisany obraz i, jeśli tak, wyświetla go w odpowiednim miejscu.
Napiszemy teraz taki skrypt. Przyjmujemy założenie, że jeśli użytkownik prześle obraz dla danego wpisu, to adres URL tego obrazu zostaje zapisany w zmiennej o nazwie $featuredImage
. Zatem najpierw sprawdzamy, czy zmienna $featuredImage
jest ustawiona:
if (isset($featuredImage))
Jeśli powyższe wyrażenie warunkowe ma wartość true
, to znaczy, że zmienna $featuredImage
zawiera adres URL obrazu do wstawienia na górze strony. Pozostaje nam więc już tylko wyświetlić ten obraz. Najpierw pokażę ci, jak „złożyć” element obrazu, a potem poskładamy w całość kompletną instrukcję warunkową.
Do wstawiania obrazów na strony służy element HTML img. W atrybucie HTML src należy podać adres obrazu, w atrybucie HTML alt najczęściej powinien być opis tego obrazu. Ponadto dobrze jest zdefiniować atrybut width i atrybut height (jeśli ciekawi cię dlaczego to takie dobre, to zobacz Wymiary obrazu – atrybuty width i height). Zatem do dzieła:
<img src="<?php echo $featuredImage; ?>" alt="Opis obrazka" width="1200" height="400">
Na serwerze w miejsce zmiennej $featuredImage zostanie wstawiony adres URL obrazu, dzięki czemu do przeglądarki użytkownika serwer wyśle już gotowy element HTML img z prawidłowo skonstruowanym atrybutem src i na stronie pojawi się nasza grafika. Teraz wystarczy złożyć instrukcję warunkową w całość:
<?php if (isset($featuredImage)) { ?>
<img src="<?php echo $featuredImage; ?>" alt="Opis obrazka" width="1200" height="400">
<?php } ?>
Zwróć uwagę na to, jak podzieliłem na dwie części instrukcję if
: najpierw napisałem część zawierającą warunek i klamrę otwierającą bloku kodu, potem zamknąłem tryb PHP, aby ułatwić sobie pisanie kodu HTML, po czym znowu otworzyłem tryb PHP, aby zakończyć instrukcję if
klamrą zamykającą.
To o wiele wygodniejsze i prostsze rozwiązanie niż „zabawa” z konstrukcją echo
, która w tym przypadku mogłaby wyglądać tak:
<?php
if (isset($featuredImage)) {
echo '<img src="' . $featuredImage . '" alt="Opis obrazka" width="1200" height="400">';
}
?>
Często ilość kodu HTML do wstawienia jest znacznie większa i wtedy korzyści z używania tej metody są jeszcze większe.
Oczywiście dynamiczny może być każdy atrybut elementu img
. Możemy na przykład wymagać, aby każdy element obrazu miał opis w atrybucie atrybucie HTML alt. Jeśli użytkownik go nie poda, to stosujemy jakiś standardowy opis.
Jednym ze sposobów na realizację tego pomysłu jest użycie instrukcji if
wewnątrz instrukcji if
.
Zagnieżdżanie instrukcji PHP if
Aby wstawić na stronę obraz i sprawdzić, czy zdefiniowano dla niego treść atrybutu alt
, możemy rozbudować poprzednią instrukcję if
przez wstawienie do niej jeszcze dwóch innych instrukcji if
.
Dla przypomnienia, adres URL obrazu znajduje się w zmiennej $featuredImage
. Zdefiniowany przez użytkownika tekst do wstawienia do atrybutu HTML alt
niech będzie w zmiennej $featuredImageAlt
, a standardowy tekst zastępczy, stosowany gdy użytkownik nie poda swojego, zapisaliśmy w zmiennej $defaultFeaturedImageAlt
. Spójrz na poniższy przykład:
<?php
if (isset($featuredImage)) {
if (isset($featuredImageAlt)) {
?>
<img src="<?php echo $featuredImage; ?>" alt="<?php $featuredImageAlt ?>" width="1200" height="400">
<?php
}
if (!isset($featuredImageAlt)) {
?>
<img src="<?php echo $featuredImage; ?>" alt="<?php $defaultFeaturedImageAlt ?>" width="1200" height="400">
<?php
}
}
?>
W tym skrypcie wykonujemy takie działania:
- W wierszu 2. sprawdzamy, czy mamy adres URL obrazu w zmiennej
$featuredImage
. - Jeśli tak, to w wierszu 3. sprawdzamy, czy dla tego obrazu istnieje zdefiniowana wartość atrybutu HTML alt.
- Jeśli tak, to w wierszu 5. wstawiamy ją do tego atrybutu
alt
. - Jeśli nie, to w wierszu 8. sprawdzamy, czy dla obrazu nie istnieje zdefiniowana przez użytkownika wartość atrybutu HTML alt.
- W wierszu 10. do atrybutu
alt
naszego obrazu wstawiamy standardowy opis ze zmiennej$defaultFeaturedImageAlt
.
W uproszczeniu cała powyższa konstrukcja ma taką strukturę:
if (jest-obraz)) { if (jest-alt-użytkownika)) { wstawiamy-obraz-i-alt-użytkownika } if (nie-ma-alt-użytkownika)) { wstawiamy-obraz-i-alt-standardowy } }
W ten sposób instrukcje PHP if
można zagnieżdżać na dowolną głębokość, choć lepiej nie przesadzać, bo zbyt skomplikowane konstrukcje prawie zawsze oznaczają kłopoty.
Ponadto do tworzenia takich konstrukcji, jak powyższa istnieje specjalny wariant instrukcji if
— z klauzulą else
. Za chwilę ci ją pokażę, ale najpierw chcę cię zapoznać z alternatywnym sposobem zapisu instrukcji PHP if
.
Składnia alternatywna instrukcji PHP if
Niektóre instrukcje sterujące PHP, w tym instrukcję PHP if
, można zapisywać na dwa sposoby. Pod względem sposobu działania w większości przypadków nie ma między nimi różnicy. Ale niektórym alternatywna składnia może się podobać dlatego, że trochę lepiej wygląda w mieszance z kodem HTML. Spójrz na poniższy przykład:
<?php if ($isUserLoggedIn): ?>
<p>Użytkownik jest zalogowany.</p>
<?php endif; ?>
W składni alternatywnej instrukcji PHP if
znak otwarcia klamry zastępuje dwukropek, a znak zamknięcia klamry zastępuje słowo kluczowe endif;
(zwróć uwagę, na znajdujący się po nim średnik).
endif
można pominąć, ponieważ jest to ostatnia instrukcja przed zamykającym znacznikiem ?>
. Lepiej jednak tego nie robić, żeby nie ryzykować pomyłki przy rozbudowie kodu w przyszłości.Instrukcja warunkowa PHP if-else
Instrukcja PHP if-else pozwala na podwójne rozgałęzienie. Najpierw sprawdza warunek. Jeśli jest on spełniony, to wykonuje blok instrukcji znajdujący się po słowie kluczowym if
. Jeśli warunek nie jest spełniony, to wykonuje blok instrukcji znajdujący się po słowie kluczowym else
.
Działanie instrukcji if-else
można streścić następująco: „jeśli warunek jest spełniony, to wykonaj czynność x, a jeśli nie jest spełniony, to wykonaj czynność y”. Spójrz na poniższy schemat, który to obrazuje.

Instrukcja if-else
przydaje się w wielu sytuacjach. Za jej pomocą można na przykład zaimplementować obsługę logowania użytkowników do systemu. Spójrz na poniższy kod:
$isAdmin = true;
if ($isAdmin) {
echo "Witaj, Szanowny Panie Administratorze.";
} else {
echo "To nie jest strona dla oczu szarego człowieka.";
}
Jeśli zmienna $isAdmin
ma wartość true
, to użytkownik zostaje wpuszczony do systemu. Jeśli natomiast ma wartość false
, to otrzymuje informację, że nie ma dostępu do tej strony.
Oczywiście w instrukcję PHP if-else
także można wplatać kod HTML.
Wplatanie kodu HTML w instrukcję PHP if-else
W ramach przykładu wplatania kodu HTML w instrukcję if-else
przerobimy poprzedni kod. Spójrz poniżej:
<?php
$isAdmin = true;
if ($isAdmin) {
?>
<p><strong>Witaj,</strong> Szanowny Panie Administratorze.</p>
<?php } else { ?>
<p>To nie jest strona dla oczu <strong>szarego człowieka</strong>.</p>
<?php } ?>
Tym razem, zamiast używać konstrukcji językowej PHP echo, „wyszedłem” w wybranych miejscach z trybu PHP do trybu HTML i wpisałem potrzebny mi kod ze znacznikami HTML.
if-else
.Składnia alternatywna instrukcji if-else
Instrukcja if-else
, tak jak if
, obsługuje składnię alternatywną. Spójrz na poniższy przykład:
$isAdmin = true;
if ($isAdmin):
echo "Witaj, administratorze.<br>";
echo "Mam dla Ciebie kilka wiadomości.";
else:
echo "Brak uprawnień.<br>";
echo "Ić stont.";
endif;
Z wplecionym kodem HTML też całkiem dobrze to wygląda:
<?php $isAdmin = true; ?>
<?php if ($isAdmin): ?>
<p>Witaj, administratorze.</p>
<p>Mam dla Ciebie kilka wiadomości.</p>
<?php else: ?>
<p>Brak uprawnień.</p>
<p><strong>Ić stont!</strong></p>
<?php endif; ?>
Znasz już pojedynczą instrukcję if
, instrukcję if-else
, która pozwala wykonywać podwójne rozgałęzienia, więc pora poznać trzeci wariant instrukcji PHP if
— taki, który umożliwia tworzenie dowolnej liczby rozgałęzień przepływu sterowania w skrypcie.
Instrukcja warunkowa PHP if-elseif / if-else if
Jeśli chcesz móc wybrać spośród większej liczby opcji niż dwie, to możesz użyć instrukcji warunkowej if-elseif / if-else if
. Instrukcja ta występuje w dwóch prawie równoważnych formach, więc żeby nie mieszać, będę posługiwał się tylko tą pierwszą — if-elseif
.
Budowa tej instrukcji jest bardzo podobna do dwóch poprzednich. Spójrz na poniższy przykład ilustrujący sposób jej działania.
$fruit = "jabłko";
if ($fruit === "japko") {
echo "To jest japko.";
} elseif ($fruit === "ślifka") {
echo "To jest ślifka.";
} elseif ($fruit === "grużka") {
echo "To jest grużka.";
} else {
echo "To chiba nie jest rzaden owoc.";
}
Instrukcja PHP if-elseif
najpierw sprawdza wartość wyrażenia znajdującego się po słowie kluczowym if
. Jeśli jest to false
, to przechodzi do pierwszej klauzuli elseif
. Jeśli jej wartość to false
, to przechodzi do następnej klauzuli elseif
. Jeśli wyrażenie żadnej klauzuli elseif
nie ma wartości true
, to zostaje wykonany kod klauzuli else
(ale nie jest ona obowiązkowa). Ilustruje to poniższy diagram przepływu sterowania.
Teraz przyjrzymy się składni alternatywnej instrukcji PHP if-elseif / if-else if
.
Składnia alternatywna instrukcji if-elseif / if-else if
Składnia alternatywna instrukcji if-elseif / if-else if
jest praktycznie taka sama, jak składnia alternatywna dwóch poprzednich wariantów instrukcji if
. Czyli otwierający znak klamry zamieniamy na dwukropek, a zamykający znak klamry — na endif;
. Na przykład:
$fruit = "jabłko";
if ($fruit === "japko"):
echo "To jest japko.";
elseif ($fruit === "ślifka"):
echo "To jest ślifka.";
elseif ($fruit === "grużka"):
echo "To jest grużka.";
else:
echo "To chiba nie jest rzaden owoc.";
endif;
I jeszcze spójrz na wersję z wplecionym kodem HTML:
<?php $fruit = "jabłko"; ?>
<?php if ($fruit === "japko"): ?>
<p>To jest japko.</p>
<?php elseif ($fruit === "ślifka"): ?>
<p>To jest ślifka.</p>
<?php elseif ($fruit === "grużka"): ?>
<p>To jest grużka.</p>
<?php else: ?>
<p>To chiba nie jest rzaden owoc.</p>
<?php endif; ?>
Różnica między if-elseif a if-else if
Warianty instrukcji if-elseif
i if-else if
różnią się tylko jednym szczegółem: w składni alternatywnej można używać tylko wariantu z pojedynczym słowem kluczowym elseif
, np.:
<?php if ($fruit === "japko"): ?>
<p>To jest japko.</p>
<?php else if ($fruit === "ślifka"): // To jest błąd składni ?>
<p>To jest ślifka.</p>
<?php endif; ?>
Formatowanie instrukcji warunkowych PHP if
Są różne szkoły formatowania zapisu instrukcji warunkowych PHP if
, np. niektórzy wolą umieszczać klamry w osobnych wierszach:
if ($a > 10)
{
echo "Liczba $a jest większa od 10";
}
else
{
echo "Liczba $a nie jest większa od 10";
}
Inni z kolei wolą umieszczać klamry w tym samym wierszu, w którym znajdują się słowa kluczowe, np.:
if ($a > 10) {
echo "Liczba $a jest większa od 10";
} else {
echo "Liczba $a nie jest większa od 10";
}
Wybór konkretnego sposobu zapisu jest kwestią gustu i nie ma wpływu na samo działanie skryptów. Ja na przykład wolę drugą z przedstawionych wersji. Jest zwięźlejsza i łatwiej jest mi ogarnąć wzrokiem większą ilość kodu na raz.
Ponadto ten sposób formatowania jest zalecany przez standard kodowania PSR-12: Extended Coding Style, 5.1 if, elseif, else. Jeśli wolisz inny styl, to nie ma problemu, ale warto starać się konsekwentnie stosować jeden.
Znasz już wszystkie warianty instrukcji PHP if, więc możemy przejść do omówienia pozostałych dwóch: switch
i match
. Zaczniemy od instrukcji switch
, która w PHP ma o wiele dłuższy staż. Życzę owocnej nauki!

Instrukcja warunkowa PHP switch
Instrukcja PHP switch umożliwia wygodne porównywanie jednej wartości z szeregiem innych wartości w celu znalezienia pasującej pary.
Inaczej mówiąc, w instrukcji switch
określamy pewną wartość, np. w formie zmiennej lub wyrażenia, i porównujemy ją z kilkoma innymi wartościami, aby sprawdzić, czy do którejś pasuje. Jeśli uda się znaleźć pasującą pozycję, to wykonujemy odpowiedni blok instrukcji. Oto jej ogólna postać w formie pseudokodu:
switch (wyrażenie) { case wyrażenie-1: blok kodu; break; case wyrażenie-2: blok kodu; break; case wyrażenie-n: blok kodu; break; default: blok kodu; }
Instrukcja PHP switch
składa się ze słowa kluczowego switch
, po którym w nawiasie znajduje się wyrażenie, którego wartość będzie szukana w klauzulach case
.
Następnie otwieramy klamrę i wpisujemy serię klauzul case
.
Każda z nich składa się ze słowa kluczowego case
, po którym znajduje się wyrażenie zakończone dwukropkiem (można też używać średnika, ale jest to rzadziej używana opcja). Wartość tego wyrażenia jest porównywana z wartością wyrażenia switch
.
Po dwukropku znajduje się blok instrukcji klauzuli case
, który może zawierać dowolną liczbę instrukcji, ale powinien być zakończony instrukcją break
.
Tak to wygląda w teorii. Poniżej znajduje się jeszcze diagram wizualnie przedstawiający przepływ sterowania w instrukcji PHP switch
.

A teraz spójrz na poniższy konkretny przykład, który z pewnością wyda Ci się dziwnie znajomy:
$fruit = "grużka";
switch ($fruit) {
case "japko":
echo "To jest japko.";
break;
case "ślifka":
echo "To jest ślifka.";
break;
case "grużka":
echo "To jest grużka.";
break;
default:
echo "To chiba nie jest żaden owoc.";
}
Jeśli ten kod wygląda znajomo, to dobrze, bo to jest zapisana przy użyciu instrukcji switch
wersja wcześniejszej instrukcji if-elseif
.
W większości przypadków wybór wariantu instrukcji if
lub switch
jest tylko kwestią gustu. Jednak wiele osób uważa, że konstrukcja switch
jest bardziej przejrzysta oraz w pewnych przypadkach może być nieznacznie szybsza.
Wynikiem działania powyższego kodu będzie napis "To jest grużka."
. Przyjrzymy się tej instrukcji switch
szczegółowo.
- Wiersz 3. Najpierw zostaje obliczona wartość wyrażenia, która znajduje się w nawiasie za słowem kluczowym
switch
— w naszym przypadku wiadomo, że będzie to łańcuch"grużka"
. - Wiersz 4. Następnie wartość wyrażenia
switch
jest porównywana z wartością pierwszej klauzuli case — tutaj:"japko"
.Jeśli wartości pasują, to następuje wykonanie bloku instrukcji tej klauzuli, czyli w naszym przypadku instrukcji
echo
ibreak
(wiersze 5. i 6.). - Wiersz 7. Jeśli wartość wyrażenia
switch
nie pasuje do wartości pierwszej klauzulicase
(a w naszym przykładzie wiemy, że nie pasuje), to zostaje sprawdzona wartość drugiej klauzuli case —"ślifka"
.Jeśli wartości pasują, to następuje wykonanie bloku instrukcji tej klauzuli, czyli w naszym przypadku wierszy 8. i 9.
- Wiersz 10. Jeśli wartość wyrażenia
switch
nie pasuje do wartości drugiej klauzulicase
(w naszym przykładzie wiemy, że nie pasuje), to zostaje sprawdzona wartość trzeciej klauzuli case —"grużka"
.Jeśli wartości pasują (a wiemy, że pasują), to następuje wykonanie bloku instrukcji tej klauzuli, czyli w naszym przypadku wierszy 11. i 12. W efekcie na ekranie pojawia się napis
"To jest grużka."
(dzięki instrukcjiecho
) i następuje przejście do pierwszej instrukcji znajdującej się za instrukcjąswitch
(dzięki instrukcjibreak
). - Gdyby żadna z wartości klauzul
case
nie pasowała do wartości instrukcjiswitch
, to zostałby wykonany blok kodu klauzulidefault
.
Poniżej zamieszczam jeszcze kilka ogólnych uwag na temat poszczególnych części instrukcji PHP switch
:
- Instrukcja PHP switch — standardowo wykonuje porównywanie swobodne, czyli takie, jakie wykonuje operator
==
. W związku z tym na przykład wartości1
i"1"
zostałyby uznane za pasujące do siebie. - Wyrażenie instrukcji PHP switch — jego wartość jest obliczana tylko raz na początku, a potem jest porównywana z wartościami kolejnych klauzul.
- Klauzula case — jej wartością może być także bardziej rozbudowane wyrażenie, np.
$x ** $y
itp. Ważne aby wynik był jednego z typów prostych PHP:int
,string
,double
lubbool
. - Instrukcja break — powoduje zakończenie wykonywania bieżącej instrukcji
switch
. Zobacz też ramkę Uwaga na instrukcję break. - Klauzula default — jest wykonywana, kiedy do wartości wyrażenia
switch
nie pasuje wartość żadnej z klauzulcase
.Klauzulę tę zwyczajowo umieszcza się na końcu, ale nie jest to obowiązkowe — można ją umieścić w dowolnym miejscu między klauzulami
case
. Należy jednak pamiętać, że w instrukcji PHPswitch
może znajdować się tylko jedna klauzuladefault
.Klauzuli PHP
default
może też nie być w ogóle. W takim przypadku, jeśli żadna z klauzulcase
nie będzie pasowała do wartości wyrażenia, instrukcja PHPswitch
po prostu nie wykona żadnego bloku instrukcji.
Grupowanie klauzul case
Jeśli kilku opcjom chcesz przypisać ten sam blok kodu, to możesz zgrupować klauzule case
. Polega to na wypisaniu po kolei kilku klauzul case
bez własnych bloków instrukcji i umieszczeniu na końcu „listy” wspólnego bloku, np.:
switch ($ocena) {
case $ocena === 1:
case $ocena === 2:
echo "Bardzo słabo! Ucz się więcej";
break;
case $ocena === 3:
case $ocena === 4:
echo "Może być, ale da się lepiej.";
break;
case $ocena === 5:
case $ocena === 6:
echo "Bardzo dobrze!";
break;
}
Wplatanie kodu HTML w instrukcję PHP switch
Instrukcję PHP switch
, tak jak instrukcje PHP if
, można przeplatać z kodem HTML, np.:
<?php
switch ($ocena):
case $ocena === 1;
case $ocena === 2;
?>
<p><strong>Bardzo słabo! Ucz się więcej.</strong></p>
<?php
break;
case $ocena === 3:
case $ocena === 4:
?>
<p>Może być, ale da się lepiej.</p>
<?php
break;
case $ocena === 5;
case $ocena === 6;
?>
<p><strong>Bardzo dobrze!</strong></p>
<?php
break;
endswitch;
?>
W przypadku stosowania tej techniki możesz natknąć się na pewien drobny niuans powodujący błąd składni, który może napsuć ci sporo krwi, zanim dojdziesz, o co chodzi.
Między instrukcją PHP switch
a pierwszą klauzulą case
nie może znajdować się nic, co generuje jakikolwiek wynik na stronie. Na przykład, poniższy przykład jest niepoprawny:
switch ($ocena):
echo "aaa"; // To jest błąd składni
case $ocena === 1;
…
Czemu o tym mówię, skoro ten błąd jest tak oczywisty, że trudno sobie wyobrazić, jak ktoś mógłby go popełnić? Robię to, ponieważ może on wystąpić w bardziej zawoalowany sposób przy przełączaniu się między trybem PHP a HTML. Spójrz na poniższy przykład:
<?php switch ($ocena): ?>
<?php case $ocena === 1; ?>
…
Tutaj też występuje ten błąd. Przed znacznikiem otwierającym tryb PHP przed klauzulą case
znajdują się spacje, które zostałyby wysłane do strony wynikowej. Prawidłowo powinno to wyglądać tak:
<?php switch ($ocena): ?>
<?php case $ocena === 1; ?>
…
Składnia alternatywna instrukcji switch
Instrukcja switch
, tak jak wszystkie warianty instrukcji if
, występuje także w alternatywnej wersji składniowej.
W wersji tej znak otwarcia klamry zastępuje dwukropek, a znak zamknięcia klamry zastępuje słowo kluczowe endswitch;
. Spójrz na poniższy przykład:
switch ($ocena):
case $ocena === 1;
case $ocena === 2;
echo "Bardzo słabo! Ucz się więcej";
break;
case $ocena === 3:
case $ocena === 4:
echo "Może być, ale da się lepiej.";
break;
case $ocena === 5;
case $ocena === 6;
echo "Bardzo dobrze!";
break;
endswitch;
Jest to poprzedni przykład przerobiony na składnię alternatywną. Różnice są kosmetyczne. Wybierz wersję, która wizualnie bardziej do ciebie przemawia.
A jeśli jeszcze ci mało różnych możliwości, to poznaj wyrażenie PHP match
, które zostało dodane do języka całkiem niedawno, bo w wersji PHP 8.0.0.
Wyrażenie warunkowe PHP match
Wyrażenie warunkowe PHP match najpierw oblicza wartość wyrażenia podstawowego, a następnie szuka jej na liście wyrażeń warunkowych. Jeśli ją znajdzie, to wykonuje odpowiadające jej wyrażenie zwrotne. Oto jego podstawowa struktura:
match (wyrażenie_podstawowe) { wyrażenia_warunkowe => wyrażenie_zwrotne, wyrażenia_warunkowe => wyrażenie_zwrotne, wyrażenia_warunkowe => wyrażenie_zwrotne, };
Poniżej znajduje się prosty przykład użycia wyrażenia PHP match
:
$i = 2;
$liczba = match ($i) {
1 => "Jeden",
2 => "Dwa",
3 => "Trzy",
};
echo $liczba;
Wynik:
Dwa
Pamiętaj, że match
jest wyrażenie, a więc zwraca wartość. Jeśli chcesz ją zobaczyć lub użyć jej w inny sposób, musisz na przykład dodać instrukcję echo
albo zapisać ją w zmiennej PHP. W powyższym przykładzie zrobiłem jedno i drugie.
Do najważniejszych cech wyróżniających wyrażenie PHP match
, i odróżniających je od instrukcji switch
, zalicza się to, że wykonuje ono porównywanie ścisłe, takie jak operator ===
.
To znaczy, że wartości 1
i "1"
nie stanowią w nim dopasowanej pary. Pod tym względem różni się ono od instrukcji switch
, która wykonuje porównywanie swobodne, takie jak operator ==
.
Ponadto pamiętaj, że wyrażenie switch
musi być wyczerpujące. To znaczy, że obsłużone muszą być wszystkie możliwe przypadki. Na przykład:
$ocena = 2;
$a = match (true) {
$ocena < 2 => "Słaby wynik.", // Tu jest błąd
$ocena > 2 => "Średnio. Mogło być lepiej",
$ocena >= 4 => "Świetnie!",
};
W tym kodzie obsługujemy wszystkie wartości mniejsze od 2
i wszystkie wartości większe od 2
, ale nie obsługujemy samej wartości 2
. Jeśli zmienna $ocena będzie miała wartość 2
, to wystąpi błąd krytyczny PHP:
Fatal error: Uncaught UnhandledMatchError: Unhandled match case true
Są dwa rozwiązania tego problemu. Pierwsze to oczywiście „uszczelnienie” wyrażeń warunkowych, aby uwzględniały też wartość 2
. W tym celu wystarczy na przykład w pierwszym lub drugim wierszu (zależnie od potrzeby) zamienić operator <
lub >
na <=
lub >=
.
Drugie rozwiązanie polega na dodaniu klauzuli default
, która będzie używana w przypadkach, w których do wartości wyrażenia podstawowego nie pasuje wartość żadnego z wyrażeń warunkowych, np.:
match (true) {
$ocena < 2 => "Słaby wynik.", // Tu jest najpewniej błąd
$ocena > 2 => "Średnio. Mogło być lepiej",
$ocena >= 4 => "Świetnie!",
default => "Nie znam takiej oceny.",
};
Grupowanie wyrażeń warunkowych
W wyrażeniu match
można grupować wyrażenia warunkowe, jeśli odnoszą się do tego samego wyrażenia zwrotnego. Należy je umieścić na liście pozycji rozdzielanych przecinkami, np.:
$operator = "+";
echo match ($operator) {
"+", "-", "*", "/" => "Operator arytmetyczny.",
"&", "|", "^", "~" => "Operator bitowy",
};
Wynik:
Operator arytmetyczny.
match
nie obsługuje składni alternatywnej.To była ostatnia konstrukcja warunkowa w tym rozdziale, ale to jeszcze nie koniec tego rozdziału.
Na dobicie chciałbym ci pokazać jeszcze jeden operator, który działa bardziej jak instrukcja sterująca niż typowy operator. Co więcej nie polecam (i nie tylko ja) jego używania, ale uważam, że przynajmniej warto wiedzieć o jego istnieniu.
Operator PHP goto
W języku PHP dostępny jest operator o nazwie goto
, za pomocą którego można przeskoczyć do dowolnego miejsca w skrypcie (dlatego czasami nazywa się go też operatorem skoku albo instrukcją skoku).
Miejsce, do którego ma nastąpić przejście, należy oznaczyć dowolnie wybraną etykietą (wielkość liter ma znaczenie) zakończoną dwukropkiem. Aby nastąpiło przejście do tak oznaczonego miejsca, należy wpisać operator goto
z wcześniej zdefiniowaną etykietą, np.:
goto x;
echo "Jakieś różne instrukcje PHP...";
x:
echo "Do tego miejsca nastąpi przeskok";
Wynikiem wykonania tego skryptu będzie napis "Do tego miejsca nastąpi przeskok"
.
Dlaczego nie polecam używania tego operatora? Ponieważ jest kontrowersyjny i przez niektórych oskarżany o wszelkie możliwe zło w programowaniu.
Mówi się, że jest on główną przyczyną powstawania tzw. kodu spaghetti, czyli bardzo skomplikowanego i pozbawionego logicznej struktury kodu źródłowego.
Oczywiście doświadczony programista potrafi zrobić z niego użytek i nie spalić przypadkiem komputera, ale generalnie najlepiej się go wystrzegać. W wielu podręcznikach do programowania, także w języku PHP, operator goto
nie jest nawet opisywany.
I tym optymistycznym akcentem zakończymy ten rozdział. Zapraszam do podsumowania oraz pytań i ćwiczeń utrwalających.
Podsumowanie

- Instrukcje sterujące dzielą się na instrukcje warunkowe i instrukcje pętlowe.
- Instrukcje warunkowe umożliwiają podejmowanie decyzji w skryptach PHP.
- W PHP są trzy instrukcje warunkowe:
if
(w różnych wariantach),switch
orazmatch
. - Instrukcja PHP
if
sprawdza warunek i wykonuje określoną instrukcję lub blok instrukcji, jeśli ten warunek jest spełniony. - Klauzula
else
instrukcjiif
umożliwia określenie bloku instrukcji do wykonania, gdy warunek nie jest spełniony. - Klauzula
elseif/else if
umożliwia zdefiniowanie dowolnej liczby kolejnych warunków do sprawdzenia i bloków instrukcji do wykonania. - Instrukcja PHP
switch
sprawdza wartość wyrażenia podstawowego i porównuje ją z szeregiem wartości klauzulcase
. - Instrukcja PHP
switch
wykonuje porównywanie swobodne. - Wszystkie warianty instrukcji
if
i instrukcjaswitch
obsługują tak zwaną składnię alternatywną. - Konstrukcja PHP
match
tak naprawdę jest wyrażeniem. Sprawdza ona wartość wyrażenia podstawowego i porównuje ją z wartościami wyrażeń warunkowych, aby znaleźć pasującą i wykonać odpowiednią instrukcję. - Wyrażenie
match
wykonuje porównywanie ścisłe. - Wszystkie konstrukcje warunkowe PHP można przeplatać z kodem HTML.
- Operator skoku
goto
umożliwia bezwarunkowe przejście do określonego miejsca w kodzie. Nie zaleca się jego używania, ponieważ utrudnia budowanie logicznej struktury programu.
Pytania
- Jakie znasz instrukcje warunkowe PHP?
- Jaką ma składnię i jak działa instrukcja PHP
if
? Opisz wszystkie warianty. - Jaką ma składnię i jak działa instrukcja PHP
switch
? - Jaki rodzaj porównywania wykonuje instrukcja PHP
switch
? - Czy stosowanie instrukcji
break
wswitch
jest obowiązkowe? - Jak wygląda składnia alternatywna instrukcji
if
iswitch
? - Jaką ma składnię i jak działa wyrażenie PHP
match
? - Jaki rodzaj porównywania wykonuje wyrażenie PHP
match
? - Co to znaczy, że
match
jest wyrażeniem, a nie instrukcją, i jakie są tego konsekwencje? - Które konstrukcje warunkowe PHP można przeplatać z kodem?
- Co to jest
goto
?
Ćwiczenia
- Jaki będzie wynik tego skryptu?
$x = 2 ** 4; if ($x > 16) { echo "To spora liczba!"; } else { echo "Nic wielkiego"; }
- Jaki będzie wynik tego skryptu?
switch (true) { case 2 == 2: echo "sto"; case 2 == 3: echo "no"; case 6 == 6: echo "ga"; }
- Napisz skrypt, który sprawdza, czy podana liczba jest parzysta, czy nieparzysta.
- Napisz skrypt, który sprawdza czy dana osoba może startować w wyborach na prezydenta w Polsce. (Trzeba mieć 35 lat). Dane do skryptu przyjmuj ze zdefiniowanej przez siebie zmiennej.
- Zdefiniuj trzy zmienne:
$liczba1
,$liczba2
i$operator
. Za pomocą instrukcji PHPswitch
i przy użyciu tych trzech zmiennych napisz prosty kalkulator, który przyjmuje dwie liczby i operator oraz wykonuje na tych liczbach odpowiednią operację.Postaraj się, aby Twój kalkulator był w miarę odporny na błędy. W tym celu:
- Za pomocą funkcji
is_numeric()
sprawdzaj, czy zmienne$liczba1
i$liczba2
zawierają wartości liczbowe. Jeśli któraś nie jest liczbą, to nie wykonuj obliczeń, tylko wyświetl odpowiedni komunikat. - Określ zestaw obsługiwanych operatorów, np.
+
,-
,/
i*
, i wykonuj obliczenia tylko wtedy, gdy został wybrany jeden z nich. Jeśli nie, to nie wykonuj obliczeń, tylko wyświetl odpowiedni komunikat.
- Za pomocą funkcji
- Napisz kalkulator z ćwiczenia 3. przy użyciu wyrażenia PHP
match
.