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