PHP: switch
Часто вместо нескольких расположенных подряд операторов if else целесообразно воспользоваться специальной конструкцией switch-case . Оператор switch сравнивает значение условного выражения с несколькими значениями. Как правило, в качестве выражения используется переменная, в зависимости от значения которой должен быть исполнен тот или иной блок кода. Для сравнения в switch используется оператор равенства ( == ).
Представим себе переменную $action , которая может иметь значения «JUMP» (прыгать), «SWEEM» (плавать), «FLY» (летать). Оператор switch позволяет легко определить блок кода, который должен исполняться для каждого из этих значений. Чтобы показать разницу между операторами if и switch , выполним проверку переменной на соответствие нескольким значениям. Следующий пример показывает два различных способа сделать то же самое. Первый способ использует серию операторов if и elseif , а второй — оператор switch :
elseif ($action == 'SWEEM') < echo "Я люблю плавать."; >elseif ($action == 'FLY') < echo "Хотел бы я научиться летать."; >switch ($action) < case 'JUMP': echo "Мне нравится прыгать."; break; case 'SWEEM': echo "Я люблю плавать."; break; case 'FLY': echo "Хотел бы я научиться летать."; break; >?>
Оператор switch берет значение, возвращаемое условным выражением, и начинает сравнивать его со всеми значениями, стоящими рядом с ключевым словом case (метка), в порядке их следования. Как только совпадение обнаружено, выполняется соответствующий блок кода. Если соответствие не найдено, не исполняется ни один из блоков.
Примечание: условное выражение должно возвращать значение элементарного типа, например число или строку.
case
Обратите внимание, что за ключевым словом case каждый раз следует значение (литерал), после которого должно обязательно стоять двоеточие. Тип значения, указанного после оператора case , должен совпадать с типом значения возвращаемого условием. Перед началом исполнения тела (содержимое между фигурными скобками) оператора switch , переменная указанная в скобках, должна быть инициализирована каким-нибудь значением, поскольку это значение будет сравниваться со значениями, указанными после case. Инструкции, расположенные после case , будут исполняться до тех пор, пока не встретится оператор break .
Примечание: в операторе case может быть использовано любое выражение, которое приводится к простому типу, то есть к числу ( integer ), вещественному числу ( float ), строке ( string ) или логическому значению ( bool ).
break
Если должен быть выполнен только один блок кода, соответствующий определенному значению, то в конце этого блока следует вставить ключевое слово break . Интерпретатор PHP, встретив ключевое слово break , завершает работу оператора switch и переходит к исполнению инструкции, расположенной после закрывающей фигурной скобки оператора switch .
Конструкции case в операторе switch задают только начальную точку выполняемого программного кода, но не задают никаких конечных точек. В случае отсутствия ключевого слова break , оператор switch начнёт выполнение блока кода с метки ( case ), значение которой соответствует значению условного выражения, и продолжит выполнение инструкций до тех пор, пока не дойдет до конца всего блока. Поэтому стоит быть аккуратнее и не забывать завершать каждый блок case оператором break . В следующем примере показано, что происходит при отсутствии ключевого слова break :
"; case 'SWEEM': echo "Я люблю плавать.
"; case 'FLY': echo "Хотел бы я научиться летать.
"; > ?>
В результате работы скрипта, будут выведены все три записи. Однако иногда бывает полезным опускать намеренно оператор break, например в таких случаях, когда при совпадении одного из нескольких значений, должен исполняться один блок кода:
Обратите внимание на этот пример: список инструкций для выполнения в секции case может быть пустым, в этом случае управление просто передается далее по списку — следующему оператору case .
continue
Обратите внимание: оператор continue применяется в конструкциях switch и действует подобно оператору break .
Выбор по умолчанию
Если значение условного выражения не совпало ни с одним из предложенных значений в секциях case, оператор switch позволяет выполнить некоторые действия по умолчанию. Для этого используется ключевое слово default . Работает оно следующим образом: если значение возвращаемое условием не совпало ни с одним из предложенных значений в секциях case, оператор switch начинает выполнение инструкций расположенных в секции default .
"; case 'SWEEM': echo "Я люблю плавать.
"; case 'FLY': echo "Хотел бы я научиться летать.
"; default: echo 'Что-то мне вообще лень, что-либо делать.'; > ?>
Оператор default обычно указывается в конце тела switch , после всех меток ( case ). Это логичное и обычное место для него, но на самом деле, оператор default может быть расположен в любом месте внутри конструкции switch . Так как блок кода расположенный в секции default обычно является последним в теле switch , ключевое слово break чаще всего опускают.
Дополнительные сведения
Возможно у вас возник вопрос когда же лучше использовать оператор switch , если тоже самое можно сделать используя оператор if else ? Ответить на этот вопрос можно так: в операторе switch выражение вычисляется всего один раз и этот результат сравнивается с каждым значением оператора case. В условных выражениях elseif , значение выражения вычисляется каждый раз заново. Если ваше условие более сложное, чем простое сравнение и/или находится к примеру в цикле, в этом случае конструкция switch может работать быстрее, чем elseif .
На последок хотелось бы упомянуть о том, что вместо двоеточия после операторов case и default , можно использовать точку с запятой:
Type case in php
The switch statement is similar to a series of IF statements on the same expression. In many occasions, you may want to compare the same variable (or expression) with many different values, and execute a different piece of code depending on which value it equals to. This is exactly what the switch statement is for.
Note: Note that unlike some other languages, the continue statement applies to switch and acts similar to break . If you have a switch inside a loop and wish to continue to the next iteration of the outer loop, use continue 2 .
In the following example, each code block is equivalent. One uses a series of if and elseif statements, and the other a switch statement. In each case, the output is the same.
Example #1 switch structure
switch ( $i ) case 0 :
echo «i equals 0» ;
break;
case 1 :
echo «i equals 1» ;
break;
case 2 :
echo «i equals 2» ;
break;
>
if ( $i == 0 ) echo «i equals 0» ;
> elseif ( $i == 1 ) echo «i equals 1» ;
> elseif ( $i == 2 ) echo «i equals 2» ;
>
?>
It is important to understand how the switch statement is executed in order to avoid mistakes. The switch statement executes line by line (actually, statement by statement). In the beginning, no code is executed. Only when a case statement is found whose expression evaluates to a value that matches the value of the switch expression does PHP begin to execute the statements. PHP continues to execute the statements until the end of the switch block, or the first time it sees a break statement. If you don’t write a break statement at the end of a case’s statement list, PHP will go on executing the statements of the following case. For example:
switch ( $i ) case 0 :
echo «i equals 0» ;
case 1 :
echo «i equals 1» ;
case 2 :
echo «i equals 2» ;
>
?>?php
Here, if $i is equal to 0, PHP would execute all of the echo statements! If $i is equal to 1, PHP would execute the last two echo statements. You would get the expected behavior (‘i equals 2’ would be displayed) only if $i is equal to 2. Thus, it is important not to forget break statements (even though you may want to avoid supplying them on purpose under certain circumstances).
In a switch statement, the condition is evaluated only once and the result is compared to each case statement. In an elseif statement, the condition is evaluated again. If your condition is more complicated than a simple compare and/or is in a tight loop, a switch may be faster.
The statement list for a case can also be empty, which simply passes control into the statement list for the next case.
switch ( $i ) case 0 :
case 1 :
case 2 :
echo «i is less than 3 but not negative» ;
break;
case 3 :
echo «i is 3» ;
>
?>?php
A special case is the default case. This case matches anything that wasn’t matched by the other cases. For example:
switch ( $i ) case 0 :
echo «i equals 0» ;
break;
case 1 :
echo «i equals 1» ;
break;
case 2 :
echo «i equals 2» ;
break;
default:
echo «i is not equal to 0, 1 or 2» ;
>
?>?php
Note: Multiple default cases will raise a E_COMPILE_ERROR error.
Note: Technically the default case may be listed in any order. It will only be used if no other case matches. However, by convention it is best to place it at the end as the last branch.
If no case branch matches, and there is no default branch, then no code will be executed, just as if no if statement was true.
A case value may be given as an expression. However, that expression will be evaluated on its own and then loosely compared with the switch value. That means it cannot be used for complex evaluations of the switch value. For example:
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;
>
For more complex comparisons, the value true may be used as the switch value. Or, alternatively, if — else blocks instead of switch .
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;
>
The alternative syntax for control structures is supported with switches. For more information, see Alternative syntax for control structures.
switch ( $i ):
case 0 :
echo «i equals 0» ;
break;
case 1 :
echo «i equals 1» ;
break;
case 2 :
echo «i equals 2» ;
break;
default:
echo «i is not equal to 0, 1 or 2» ;
endswitch;
?>?php
It’s possible to use a semicolon instead of a colon after a case like:
switch( $beer )
case ‘tuborg’ ;
case ‘carlsberg’ ;
case ‘stella’ ;
case ‘heineken’ ;
echo ‘Good choice’ ;
break;
default;
echo ‘Please make a new selection. ‘ ;
break;
>
?>?php