switch

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

Инструкция switch похожа на серию инструкций IF, которые проверяют одно и то же выражение. Одну и ту же переменную или выражение часто сравнивают с разными значениями, чтобы выполнить ту часть кода, условию выполнения которой соответствует значение переменной или выражения. Инструкция switch выполняет такие проверки.

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

Замечание:

Обратите внимание, конструкция switch/case выполняет нестрогое сравнение.

В следующем примере блоки кода выполняют эквивалентные проверки. Один блок выполняет проверки через серию инструкций if и elseif, другой — через инструкцию switch. Каждый блок кода выдаёт одинаковый результат.

Пример #1 Структура инструкции switch

<?php

// Инструкция switch:

switch ($i) {
case
0:
echo
"Значение переменной \$i равно 0";
break;
case
1:
echo
"Значение переменной \$i равно 1";
break;
case
2:
echo
"Значение переменной \$i равно 2";
break;
}

// ...эквивалентна:

if ($i == 0) {
echo
"Значение переменной \$i равно 0";
} elseif (
$i == 1) {
echo
"Значение переменной \$i равно 1";
} elseif (
$i == 2) {
echo
"Значение переменной \$i равно 2";
}

?>

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

<?php

switch ($i) {
case
0:
echo
"Значение переменной \$i равно 0";
case
1:
echo
"Значение переменной \$i равно 1";
case
2:
echo
"Значение переменной \$i равно 2";
}

?>

PHP выполнит инструкцию echo каждого случая, если значение переменной $i равно 0! PHP выполнит инструкции echo двух последних случаев, если значение переменной $i равно 1. Код поведёт себя предсказуемо и выведет «Значение переменной $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";
}

?>

Инструкция default управляет случаями по умолчанию. Управление переходит к случаю по умолчанию при несовпадении значения выражения 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 не равно 0, 1 или 2";
}

?>

Замечание: Многократные инструкции default вызовут ошибку уровня E_COMPILE_ERROR.

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

Код не выполнится, как если бы ни одна инструкция if не оказалась истинной, если ни одна ветвь инструкций case не соответствует значению проверки и инструкцию default не указали.

Значение секции case разрешается указывать в виде выражения. Однако это выражение вычисляется само по себе, а затем нестрого сравнивается со значением инструкции switch. Поэтому выражение нельзя использовать для сложных оценок значения конструкции switch. Приведём пример несложной оценки:

<?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;
}

// Код выведет "B"

?>

Для более сложных сравнений в значении инструкции switch указывают значение true, или выполняют сравнения альтернативным способом — в блоках 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;
}

// Код выведет "B"

?>

Блоки 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 не равно 0, 1 или 2";
endswitch;

?>

После выражения инструкции case вместо двоеточия разрешается указывать точку с запятой. Например:

<?php

switch ($beer) {
case
'Tuborg';
case
'Carlsberg';
case
'Stella';
case
'Heineken';
echo
'Хороший выбор';
break;
default;
echo
'Пожалуйста, выберите заново...';
break;
}

?>

Смотрите также