switch

(PHP 4, PHP 5, PHP 7, PHP 8)

Оператор switch похож на ряд операторов IF с одинаковым условием. Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). Это именно тот случай, для которого удобен оператор switch.

Замечание: Обратите внимание, что в отличие от некоторых других языков, оператор continue применяется в конструкциях switch и действует подобно оператору break. Если у вас конструкция switch находится внутри цикла, и вам необходимо перейти к следующей итерации цикла, используйте continue 2.

Замечание:

Заметьте, что конструкция switch/case использует нестрогое сравнение (==).

Следующие два примера иллюстрируют два различных способа написать то же самое. Один использует ряд операторов if и elseif, а другой - оператор switch:

Пример #1 Оператор switch

<?php
if ($i == 0) {
    echo 
"i равно 0";
} elseif (
$i == 1) {
    echo 
"i равно 1";
} elseif (
$i == 2) {
    echo 
"i равно 2";
}

switch (
$i) {
    case 
0:
        echo 
"i равно 0";
        break;
    case 
1:
        echo 
"i равно 1";
        break;
    case 
2:
        echo 
"i равно 2";
        break;
}
?>

Пример #2 Оператор switch допускает сравнение с типом string

<?php
switch ($i) {
    case 
"яблоко":
        echo 
"i это яблоко";
        break;
    case 
"шоколадка":
        echo 
"i это шоколадка";
        break;
    case 
"пирог":
        echo 
"i это пирог";
        break;
}
?>

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

<?php
switch ($i) {
    case 
0:
        echo 
"i равно 0";
    case 
1:
        echo 
"i равно 1";
    case 
2:
        echo 
"i равно 2";
}
?>

В этом примере, если $i равно 0, то PHP исполнит все операторы echo! Если $i равно 1, PHP исполнит два последних оператора echo. Вы получите ожидаемое поведение оператора ('i равно 2' будет отображено) только, если $i будет равно 2. Таким образом, важно не забывать об операторах break (даже если вы, возможно, хотите избежать его использования по назначению при определенных обстоятельствах).

В операторе switch выражение вычисляется один раз и этот результат сравнивается с каждым оператором case. В выражении elseif, выражение вычисляется снова. Если ваше условие более сложное, чем простое сравнение и/или находится в цикле, конструкция switch может работать быстрее.

Список операторов для исполнения в секции case также может быть пустым, что просто передает управление списку операторов в следующей секции case.

<?php
switch ($i) {
    case 
0:
    case 
1:
    case 
2:
        echo 
"i меньше чем 3, но неотрицательный";
        break;
    case 
3:
        echo 
"i равно 3";
}
?>

Специальный вид конструкции case - default. Сюда управление попадает тогда, когда не сработал ни один из других операторов case. Например:

<?php
switch ($i) {
    case 
0:
        echo 
"i равно 0";
        break;
    case 
1:
        echo 
"i равно 1";
        break;
    case 
2:
        echo 
"i равно 2";
        break;
    default:
       echo 
"i не равно 0, 1 или 2";
}
?>

Замечание: Несколько указаний default вызовут ошибку E_COMPILE_ERROR.

Возможен альтернативный синтаксис для управляющей структуры switch. Для более детальной информации, см. Альтернативный синтаксис для управляющих структур.

<?php
switch ($i):
    case 
0:
        echo 
"i равно 0";
        break;
    case 
1:
        echo 
"i равно 1";
        break;
    case 
2:
        echo 
"i равно 2";
        break;
    default:
        echo 
"i не равно to 0, 1 или 2";
endswitch;
?>

Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :

<?php
switch($beer)
{
    case 
'tuborg';
    case 
'carlsberg';
    case 
'heineken';
        echo 
'Хороший выбор';
    break;
    default;
        echo 
'Пожалуйста, сделайте новый выбор...';
    break;
}
?>