switch
Оператор switch похож на ряд операторов IF
с одинаковым условием. Во многих случаях вам может понадобиться
сравнивать одну и ту же переменную (или выражение) с множеством
различных значений и выполнять различные участки кода в зависимости
от того, какое значение принимает эта переменная (или выражение). Это
именно тот случай, для которого удобен оператор switch.
Обратите внимание, что в отличие от некоторых других языков, оператор
continue применяется в конструкциях
switch и действует подобно оператору break. Если у вас
конструкция switch находится внутри цикла, и вам необходимо перейти к
следующей итерации цикла, используйте continue 2.
Заметьте, что конструкция switch/case использует
нестрогое сравнение (==).
В следующем примере каждый блок кода эквивалентен.
В одном используется серия операторов if и elseif,
а в другом - оператор switch. В каждом случае результат один и тот же.
Оператор switch
]]>
Оператор switch допускает сравнение с типом string
]]>
Важно понять, как оператор switch выполняется,
чтобы избежать ошибок. Оператор switch исполняет
строчка за строчкой (на самом деле выражение за выражением).
В начале никакой код не исполняется. Только в случае
нахождения оператора case, значение которого
совпадает со значением выражения в операторе switch,
PHP начинает исполнять операторы. PHP продолжает исполнять операторы
до конца блока switch либо до тех пор, пока не
встретит оператор break. Если вы не напишете
оператор break в конце секции case, PHP будет продолжать
исполнять команды следующей секции case. Например :
]]>
В этом примере, если $i равно 0, то PHP исполнит все операторы echo!
Если $i равно 1, PHP исполнит два последних оператора echo.
Вы получите ожидаемое поведение оператора ('i равно 2' будет отображено) только, если
$i будет равно 2. Таким образом, важно не забывать об операторах
break (даже если вы, возможно, хотите избежать его использования по назначению
при определённых обстоятельствах).
В операторе switch выражение вычисляется
один раз и этот результат сравнивается с каждым оператором
case. В выражении elseif,
выражение вычисляется снова. Если ваше условие более сложное,
чем простое сравнение и/или находится в цикле, конструкция
switch может работать быстрее.
Список операторов для исполнения в секции case также может быть пустым, что просто
передаёт управление списку операторов в следующей секции case.
]]>
Специальный вид конструкции case - default. Сюда управление попадает
тогда, когда не сработал ни один из других операторов case. Например:
]]>
Несколько указаний default вызовут ошибку E_COMPILE_ERROR.
Формально конструкция default может быть перечислена в любом месте.
Она будет использоваться только в том случае, если ни один другой вариант не подходит.
Однако, по соглашению, лучше всего поместить её в конец, как последнюю конструкцию.
Если ни одна конструкция case не совпадает и нет конструкции default,
то код не будет выполнен, как если бы ни одно утверждение if не было истинным.
Значение case может быть задано в виде выражения. Однако это выражение будет оценено само по себе,
а затем слабо сопоставлено со значением switch.
Это означает, что его нельзя использовать для сложных оценок значения switch. Например:
]]>
Для более сложных сравнений в качестве значения switch может использоваться значение &true;.
Или, как вариант, вместо switch использовать блоки if-else.
]]>
Возможен альтернативный синтаксис для управляющей структуры switch.
Для более детальной информации, смотрите Альтернативный синтаксис для
управляющих структур.
]]>
Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :
]]>
&reftitle.seealso;
&match;