PHP 8 i 8.1 - sprawdź co nowego!

Struktury kontrolne > Lekcja 3

switch i match

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

  1. 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.
    <?php
    $operation = '*';
    $number1 = 6;
    $number2 = 4;
    // your code here
    
    Przykładowe rozwiązanie
  2. php >=8.0 Przerób kalkulator z ćwiczenia 1. tak, aby użyć match zamiast switch.
    <?php
    $operation = '*';
    $number1 = 6;
    $number2 = 4;
    // your code here
    
    Przykładowe rozwiązanie
Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze