Struktury kontrolne > Lekcja 3
switch i match
Ostatnia modyfikacja: 01.06.2021
Nazywany jest też instrukcją wyboru. Można porównać go do użycia kilku ifów w celu sprawdzenia wartości tej samej zmiennej. Jak wygląda switch
?
<?php
switch (wartość) {
case 0:
// wykonaj jeśli wartość będzie wynosiła 0
break;
case 1:
// wykonaj jeśli wartość będzie wynosiła 1
break;
case 2:
// wykonaj jeśli wartość będzie wynosiła 2
break;
}
Zauważ, że w przeciwieństwie do warunków, nie zapisujemy tutaj instrukcji do wykonania w klamrach. Wpisujemy je po case
i koniecznie kończymy poprzez break
(są od tego wyjątki, ale zasadniczo trzeba o tym pamiętać). Bez problemu możemy również operować na stringach.
Spójrz na przykład zapisu tego samego kodu przy użyciu if
oraz switch
.
<?php
$name = 'Marek';
if ($name === 'Jan') {
echo 'Your name is Jan';
} elseif ($name === 'Marek') {
echo 'Your name is Marek';
} elseif ($name === 'Eryk') {
echo 'Your name is Eryk';
}
// result: Your name is Marek
<?php
$name = 'Marek';
switch ($name) {
case 'Jan':
echo 'Your name is Jan';
break;
case 'Marek':
echo 'Your name is Marek';
break;
case 'Eryk':
echo 'Your name is Eryk';
break;
}
// result: Your name is Marek
Tak, akurat tutaj można było po prostu zapisać echo $name
, jednak chodziło mi o pokazanie na prostym przykładzie, jak to działa :) Dodatkowo należy wiedzieć, że switch
wykonuje dopasowanie bez sprawdzenia typu. Prościej mówiąc, przykładowo case 1:
oraz case "1":
zachowają się tak samo. Działa to tak jakbyśmy korzystali z porównania poprzez ==
a nie ===
.
Istnieje także możliwość wykonania tego samego kodu dla kilku wariantów. Kopiowanie linijek w kilka miejsc byłoby kiepskim sposobem, chociażby dlatego, że w razie konieczności zmiany trzeba byłoby kilka razy poprawiać to samo i zapis niepotrzebnie by się wydłużał.
<?php
$name = 'Marek';
switch ($name) {
case 'Anna':
case 'Maria':
echo 'You are a woman';
break;
case 'Jan':
case 'Marek':
case 'Eryk':
echo 'You are a man';
break;
}
// result: You are a man
Mamy również opcję ustalenia wartości domyślnej, która wykona się, jeśli wcześniej żadna nie zostanie dopasowana. Definiujemy ją poprzez default
.
<?php
$name = 'Katarzyna';
switch ($name) {
case 'Anna':
case 'Maria':
echo 'You are a woman';
break;
case 'Jan':
case 'Marek':
case 'Eryk':
echo 'You are a man';
break;
default:
echo 'I don\'t know you';
break;
}
// result: I don't know you
Alternatywny zapis
Podobnie, jak w przypadku instrukcji warunkowej, istnieje alternatywna składnia - z użyciem :
i endswitch
. Rzadko się ją spotyka, dlatego w razie potrzeby doczytaj w dokumentacji. Nie zapominaj jednak, że takowa istnieje, abyś nie był kiedyś zaskoczony.
Match
Wraz z php 8.0 została dodana nowa ciekawa konstrukcja: match
. Jest ona całkiem podobna do przedstawionej powyżej, ale każde dopasowanie może zawierać tylko jedno wyrażenie (nie linię!), którego wartość jest automatycznie zwracana. Co więcej, w przeciwieństwie do switcha, tutaj dokonywane jest porównanie wartości z uwzględnieniem typu, tak jak przy ===
.
Sama konstrukcja przypomina trochę tablicę. Pomiędzy nawiasami podajemy wartość, która będzie sprawdzana. Następnie mamy możliwe warianty oddzielone przecinkami, gdzie po lewej stronie od =>
mamy szukaną wartość, a po prawej zwracaną wartość/operację do wykonania. Początkowy przykład z imieniem moglibyśmy zapisać w ten sposób:
<?php
$name = 'Marek';
echo match ($name) {
'Jan' => 'Your name is Jan',
'Marek' => 'Your name is Marek',
'Eryk' => 'Your name is Eryk'
};
// result: Your name is Marek
Rzecz jasna ze zwróconą wartością możemy zrobić co tylko chcemy, a zamiast wstawiać po prostu tekst, wykonać tam cokolwiek. Musimy tylko pamiętać, aby zmieścić się w jednej operacji, czyli najczęściej do momentu, w którym zapisalibyśmy średnik.
Podobnie możemy wskazać kilka wariantów dla jednej opcji (tutaj robi się to po przecinku) czy skorzystać z wartości domyślnej (definiujemy ją słowem default
):
<?php
$name = 'Katarzyna';
echo match ($name) {
'Anna', 'Maria' => 'You are a woman',
'Jan', 'Marek', 'Eryk' => 'You are a man',
default => 'I don\'t know you'
};
// result: I don't know you
Ćwiczenia
- Przygotuj prosty kalkulator wykorzystujący switch. Wykonaj działanie określone w zmiennej
$operation
(+, -, *, /) na liczbach$number1
i$number2
oraz wyświetl jego wynik. W przypadku niewybrania żadnego z podanych działań wyświetl komunikat Invalid operation.
Przykładowe rozwiązanie<?php $operation = '*'; $number1 = 6; $number2 = 4; // your code here
-
php >=8.0 Przerób kalkulator z ćwiczenia 1. tak, aby użyć
match
zamiastswitch
.
Przykładowe rozwiązanie<?php $operation = '*'; $number1 = 6; $number2 = 4; // your code here
Komentarze