Krótsze zapisy tych samych decyzji
switch … case … break … default i pułapka bez breakmatch: nowsza, ścisła wersja z PHP 8? : i ?? dla brakującej wartościmenu.php$points = 80;
if ($points >= 90) { echo "A"; }
elseif ($points >= 70) { echo "B"; }
elseif ($points >= 50) { echo "C"; }
else { echo "D"; }
if ($points = 0) { echo "zero"; } else { echo "nie zero"; }?if uzna za fałsz: "0", "a", 0.0, [], " "?$day = "wt";
switch ($day) {
case "pn":
echo "Siłownia";
break;
case "wt":
echo "Nauka PHP"; // to
break;
default:
echo "Wolne";
}
Automat z guzikami: wciskacie guzik, wypada jedna rzecz. switch bierze jedną wartość i porównuje ją po kolei z każdym case. Gdy wartość pasuje do któregoś case, wykonuje się kod aż do break. Gdy nic nie pasuje, wykonuje się kod w default.
// to samo, co switch z poprzedniego slajdu (switch porównuje luźno, jak ==)
if ($day === "pn") {
echo "Siłownia";
} elseif ($day === "wt") {
echo "Nauka PHP";
} else {
echo "Wolne";
}
// dwa dni, jeden kod: case pod case
case "sb":
case "nd":
echo "Weekend";
break;
| Sytuacja | Bierzecie |
|---|---|
| Jedna zmienna, konkretne wartości („pn”, 404) | switch |
Zakresy (>= 70), różne zmienne, && | elseif |
| Dwa albo trzy przypadki | krótsze wygrywa |
switch porównuje luźno, jak ==: case 1: złapie też tekst "1". Dane z adresu i formularza to zawsze tekst, więc przy liczbach o tym pamiętajcie.
$n = 2;
switch ($n) {
case 1: echo "jeden ";
case 2: echo "dwa ";
case 3: echo "trzy ";
default: echo "inne";
}
// wypisze: dwa trzy inne
PHP znajduje pasujący case i od tego miejsca wykonuje wszystko w dół, aż trafi na break albo koniec klamry. To „przelot” (ang. fall-through). Nie jest błędem składni, więc nikt Was nie ostrzeże. Zasada: każdy case kończy się break, chyba że celowo sklejacie dwa przypadki jak „sb” i „nd”.
$code = 404;
$message = match ($code) {
200, 201 => "OK",
404 => "Nie znaleziono",
default => "Inny kod",
};
echo $message; // Nie znaleziono
echo match ("1") {
1 => "liczba 1",
default => "coś innego",
}; // coś innego
switch | match | |
|---|---|---|
| Porównanie | luźne == | ścisłe === |
Przelot bez break | tak | nie ma break, nie ma przelotu |
| Zwraca wartość | nie | tak, przypisujecie do zmiennej |
| Nic nie pasuje | pomija | błąd UnhandledMatchError |
| Od wersji | zawsze | PHP 8.0 |
Kilka wartości w jednej gałęzi rozdzielacie przecinkiem. default dopisujcie zawsze, żeby nie dostać błędu przy nieznanej wartości.
$age = 20;
// if … else w czterech liniach
if ($age >= 18) {
$label = "dorosły";
} else {
$label = "niepełnoletni";
}
// to samo w jednej
$label = $age >= 18 ? "dorosły" : "niepełnoletni";
echo $label; // dorosły
$age >= 18, to „dorosły”, inaczej „niepełnoletni”.echo. if tego nie potrafi.if albo match.Zagnieżdżony ? : wewnątrz innego ? : bez nawiasów: PHP 8 tego nie przyjmie, zgłosi błąd i wskaże, gdzie dać nawiasy. Celowo, bo taki zapis mylił ludzi.
Ciekawostka z Wikipedii: skrócony zapis $a ?: $b zwie się w innych językach (Kotlin, Groovy) „operatorem Elvisa”, bo ?: obrócony na bok przypomina fryzurę Elvisa Presleya. W PHP działa od PHP 5.3.
// adres: menu.php?name=Ola
$name = $_GET["name"] ?? "gość";
echo "Cześć, " . $name; // Cześć, Ola
// adres: menu.php (bez ?name=)
$name = $_GET["name"] ?? "gość";
echo "Cześć, " . $name; // Cześć, gość
$_GET to tablica z danymi wpisanymi w adresie po znaku ?: ?name=Ola daje $_GET["name"] równe "Ola". Gdy w adresie nic nie ma, klucza nie ma, a ?? po cichu podstawia wartość z prawej. Bez ?? PHP wypisałoby ostrzeżenie „Undefined array key”. Pełna lekcja o formularzach później.
Wskaż instrukcję równoważną do instrukcji switch zapisanej językiem PHP.
switch ($number) {
case 10:
case 20: $number++; break;
default: $number = 0;
}
// Instrukcja 1.
if ($number==10)
$number++;
else
$number = 0;
// Instrukcja 3.
if ($number==10 or $number==20)
$number++;
// Instrukcja 2.
if ($number==10 or $number==20)
$number++;
else
$number = 0;
// Instrukcja 4.
if ($number==10 and $number==20)
$number++;
else
$number = 0;
Dwa case pod sobą to przelot celowy: 10 wpada do kodu dla 20.
menu.php. Pierwsza linia: $day = $_GET["day"] ?? "brak";switch ($day) z planem dnia dla pn, wt, sr, czw, pt (jedno zdanie na dzień). sb i nd sklej w jeden „Weekend”.case "brak": Dodaj do adresu ?day=pn. default: Nie znam takiego dnia.| Koniec adresu | Ma się pojawić |
|---|---|
menu.php?day=wt | Twój plan na wtorek |
menu.php?day=nd | Weekend |
menu.php | Dodaj do adresu ?day=pn |
menu.php?day=xyz | Nie znam takiego dnia. |
Początek adresu zawsze localhost/. Każdy case kończysz break, inaczej zobaczysz plan kilku dni naraz.
Dla szybkich: przepisz to samo na match z echo przed nim.
$day = $_GET["day"] ?? "brak";
switch ($day) {
case 'pn': echo "Siłownia."; break;
case 'wt': echo "Nauka PHP."; break;
case 'sr': echo "Basen."; break;
case 'czw': echo "Kino."; break;
case 'pt': echo "Znajomi."; break;
case 'sb':
case 'nd': echo "Weekend"; break;
case "brak": echo "Dodaj do adresu ?day=pn"; break;
default: echo "Nie znam takiego dnia.";
}
// dla szybkich: to samo przez match (skrót)
echo match ($day) {
'pn' => "Siłownia.", /* … */ 'sb', 'nd' => "Weekend",
'brak' => "Dodaj do adresu ?day=pn",
default => "Nie znam takiego dnia.",
};
Pominięte break w ćwiczeniu 1 objawia się planem kilku dni naraz. Kto wypisze $day w default, dostaje pytanie o ?day=<b>x</b>.
Bez komputera. Zapisz wynik każdego fragmentu, potem sprawdź uruchamiając kod.
// 1.
$k = 3;
switch ($k) {
case 3: echo "C";
case 4: echo "D"; break;
case 5: echo "E";
}
Co wypisze ten kod?
// 2.
$m = "2";
switch ($m) {
case 2: echo "dwa"; break;
default: echo "inne";
}
Co wypisze ten kod?
// 3.
echo match ("2") {
2 => "dwa",
default => "inne",
};
Co wypisze ten kod?
// 4.
$t = 15;
echo $t > 10 ? "dużo" : "mało";
Co wypisze ten kod?
// 5.
$data = [];
echo $data['id'] ?? 0;
Co wypisze ten kod?
Fragmenty 2 i 3 wyglądają tak samo, a dają różne wyniki. Kto ma 5 na 5, tłumaczy sąsiadowi, dlaczego.
break w switch i co się dzieje, gdy go zabraknie?match od switch?echo $_GET["page"] ?? 1;, gdy w adresie nie ma ?page=?Następna lekcja: pętle. Ten sam kod wykonany wiele razy, bez kopiowania.
| Na lekcji | W produkcji | Status |
|---|---|---|
switch na tekstach i liczbach | W nowym kodzie (PHP 8) pisze się match: ścisłe porównanie, bez break, zwraca wartość. switch zostaje w starszych projektach, które trzeba umieć czytać. | switch: zastępowane |
$_GET["day"] ?? "brak" | Tak samo, tylko wartość sprawdza się z listą dozwolonych, a wypisuje się przez htmlspecialchars(). Bez tego ktoś wstrzyknie w stronę obcy skrypt (atak XSS). | nadal w użyciu |
? : do jednego wyboru | Jedna linia, jeden wybór. Zagnieżdżone ? : od PHP 8 wymagają nawiasów, a w zespołach są zakazane. | zagnieżdżone: unikane |
case bez break | Narzędzia sprawdzające kod (PHP_CodeSniffer) oznaczają przelot bez komentarza jako błąd. Celowy przelot dostaje komentarz // no break. | bez komentarza: unikane |
| Kody „pn”, „wt” jako tekst | Stały zbiór wartości (dni, statusy zamówień) opisuje typ enum (PHP 8.1) w parze z match: literówka wychodzi od razu. | nadal w użyciu |