switch

Оновлено: 11.05.2023

Оператор switch схожий на серію операторів IF над одним і тим самим виразом. У багатьох випадках вам може знадобитися порівняти одну і ту ж змінну (або вираз) з багатьма різними значеннями і виконати різний фрагмент коду залежно від того, якому значенню вона дорівнює. Це саме те, для чого призначений оператор switch.

Зауваження: Зверніть увагу, що на відміну від деяких інших мов, оператор continue застосовується до перемикача і діє подібно до break. Якщо всередині циклу є перемикач, і ви хочете перейти до наступної ітерації зовнішнього циклу, використовуйте continue 2.

Зауважте:

Зауважте, що switch/case програє у порівнянні.

У наступному прикладі кожен блок коду еквівалентний. В одному використовується ряд операторів if та elseif, а в іншому - оператор switch. В обох випадках результат однаковий.

Приклад #1 структура перемикача

<?php
// This switch statement:

switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}

// Is equivalent to:

if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
}
?>

Важливо розуміти, як виконується оператор switch, щоб уникнути помилок. Оператор switch виконується рядок за рядком (фактично, оператор за оператором). На початку ніякого коду не виконується. Тільки коли знайдено оператор case, вираз якого обчислюється до значення, що збігається зі значенням виразу switch, PHP починає виконувати оператори. PHP продовжує виконувати оператори до кінця блоку switch або до першого разу, коли він побачить оператор break. Якщо ви не напишете оператор break в кінці списку операторів case, PHP продовжить виконання операторів наступного case. Наприклад:

<?php
switch ($i) {
    case 0:
        echo "i equals 0";
    case 1:
        echo "i equals 1";
    case 2:
        echo "i equals 2";
}
?>

Тут, якщо $i дорівнює 0, PHP виконає всі оператори echo! Якщо $i дорівнює 1, PHP виконає останні два оператори echo. Ви отримаєте очікувану поведінку (буде виведено 'i equals 2') тільки якщо $i дорівнює 2. Таким чином, важливо не забувати про оператори break (навіть якщо за певних обставин ви можете не використовувати їх навмисно).

В операторі switch умова обчислюється лише один раз і результат порівнюється з кожним оператором case. В операторі elseif умова обчислюється ще раз. Якщо ваша умова складніша за просте порівняння та/або знаходиться у замкнутому циклі, switch може бути швидшим.

Список операторів для випадку також може бути порожнім, тоді керування просто передається до списку операторів для наступного випадку.

<?php
switch ($i) {
    case 0:
    case 1:
    case 2:
        echo "i is less than 3 but not negative";
        break;
    case 3:
        echo "i is 3";
}
?>

Особливий випадок - це випадок за замовчуванням. Цей регістр відповідає всьому, що не відповідає іншим регістрам. Наприклад:

<?php
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
       echo "i is not equal to 0, 1 or 2";
}
?>

Зауваження: Кілька випадків за замовчуванням призведуть до помилки E_COMPILE_ERROR.

Примітка: Технічно регістр за замовчуванням може бути вказаний у будь-якому порядку. Він буде використаний лише тоді, коли жоден інший регістр не підходить. Однак, за домовленістю, найкраще розміщувати його в кінці, як останню гілку.

Якщо жодна гілка case не збігається і немає гілки за замовчуванням, то код не буде виконано, так само, як якщо б жоден оператор if не був істинним.

Значення регістру може бути задано у вигляді виразу. Однак цей вираз буде обчислюватися самостійно, а потім порівнюватися зі значенням перемикача. Це означає, що його не можна використовувати для складних обчислень значення перемикача. Наприклад:

<?php
$target = 1;
$start = 3;

switch ($target) {
    case $start - 1:
        print "A";
        break;
    case $start - 2:
        print "B";
        break;
    case $start - 3:
        print "C";
        break;
    case $start - 4:
        print "D";
        break;
}

// Prints "B"
?>

Для більш складних порівнянь можна використовувати значення true як значення switch. Або ж замість switch можна використовувати блоки if-else.

<?php
$offset = 1;
$start = 3;

switch (true) {
    case $start - $offset === 1:
        print "A";
        break;
    case $start - $offset === 2:
        print "B";
        break;
    case $start - $offset === 3:
        print "C";
        break;
    case $start - $offset === 4:
        print "D";
        break;
}

// Prints "B"
?>

Альтернативний синтаксис для керуючих структур підтримується за допомогою перемикачів. Докладнішу інформацію наведено у статті Альтернативний синтаксис для керуючих структур.

<?php
switch ($i):
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
        echo "i is not equal to 0, 1 or 2";
endswitch;
?>

Можна використовувати крапку з комою замість двокрапки після case like:

<?php
switch($beer)
{
    case 'tuborg';
    case 'carlsberg';
    case 'stella';
    case 'heineken';
        echo 'Good choice';
        break;
    default;
        echo 'Please make a new selection...';
        break;
}
?>