(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
// Оператор 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";
}
?>
Пример #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
.
Замечание: Формально конструкция
default
может быть перечислена в любом месте. Она будет использоваться только в том случае, если ни один другой вариант не подходит. Однако, по соглашению, лучше всего поместить её в конец, как последнюю конструкцию.
Если ни одна конструкция case
не совпадает и нет конструкции default
,
то код не будет выполнен, как если бы ни одно утверждение if
не было истинным.
Значение 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
.
Или, как вариант, вместо 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;
}
// Выведет "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;
}
?>