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 выполнит инструкцию echo каждого случая, если значение переменной $i равно 0!
PHP выполнит инструкции echo двух последних случаев, если значение переменной $i равно 1.
Код поведёт себя предсказуемо и выведет «Значение переменной $i равно 2», только если
значение переменной $i равно 2. Поэтому лучше помнить об инструкциях
break
, даже если в конкретных обстоятельствах инструкции прерывания умышленно не указываются.
В инструкции switch
условие вычисляется
только один раз, а результат сравнивается со значением выражения каждой инструкции
case
. В инструкции elseif
вычисление условия повторяется. Инструкция switch
часто работает
быстрее, если условие сложнее простого сравнения «и-или» проверяется в плотном цикле.
Список инструкций в секциях case разрешается оставлять пустым,
тогда управление передаётся списку инструкций следующей секции case.
Инструкция default
управляет случаями по умолчанию.
Управление переходит к случаю по умолчанию при несовпадении значения выражения switch
со значениями выражений других случаев.
Приведём пример:
Замечание:
Многократные инструкции default вызовут ошибку уровня E_COMPILE_ERROR
.
Замечание:
Технически инструкцию default
разрешается указывать в произвольном месте списка случаев.
Инструкции случая по умолчанию выполняются, только если ни один другой случай не совпал.
Однако, по общему правилу, лучше расположить инструкцию по умолчанию в конце, как последнюю ветвь.
Код не выполнится, как если бы ни одна инструкция if
не оказалась истинной,
если ни одна ветвь инструкций case
не соответствует значению проверки
и инструкцию default
не указали.
Значение секции case разрешается указывать в виде выражения. Однако это выражение
вычисляется само по себе, а затем нестрого сравнивается со значением инструкции switch.
Поэтому выражение нельзя использовать для сложных оценок значения конструкции switch.
Приведём пример несложной оценки:
Для более сложных сравнений в значении инструкции switch
указывают значение true
,
или выполняют сравнения альтернативным способом — в блоках if
-else
.
Блоки switch поддерживают альтернативный синтаксис управляющих конструкций.
Дополнительную информацию содержит раздел
«Альтернативный синтаксис управляющих конструкций».
После выражения инструкции case вместо двоеточия разрешается указывать точку с запятой. Например: