switch
(PHP 4, PHP 5, PHP 7, PHP 8)
A declaração switch
é similar a uma série de
declarações IF na mesma expressão. Em muitos casos, se deseja
comparar as mesmas variáveis (ou expressões), com
diferentes valores, e executar pedaços diferentes de código dependendo
de qual valor ela é igual. Esta é exatamente a serventia da
declaração switch
.
Nota:
Note que ao contrário de outras linguagens, a declaração
continue
aplica-se ao switch
e age similarmente ao break
. Se
possuir um switch
dentro de um laço, e deseja continuar na próxima iteração
do laço externo, utilize continue 2
.
Nota:
Note que o switch/case faz
comparação frouxa.
No exemplo a seguir, cada bloco de código é equivalente.
Um usa uma série de declarações if
e
elseif
, e o outra usa uma
declaração switch
. A saída é a mesm a em ambos os casos.
Exemplo #1 Estrutura do switch
<?php
// Esta declaração switch:
switch ($i) {
case 0:
echo "i é igual a 0";
break;
case 1:
echo "i é igual a 1";
break;
case 2:
echo "i é igual a 2";
break;
}
// É equivalente a:
if ($i == 0) {
echo "i é igual a 0";
} elseif ($i == 1) {
echo "i é igual a 1";
} elseif ($i == 2) {
echo "i é igual a 2";
}
?>
É importante entender como a declaração switch
é executada a fim de evitar enganos. A declação
switch
executa linha por linha
(na verdade, declaração por declaração). No início nenhum código é
executado. Somente quando uma declaração case
é encontrada,
cuja expressão avalia um valor que corresponde ao valor do
switch
, o PHP começará a executar a
declaração. O PHP continuará a executar a declaração até o fim do bloco
switch
, ou até a primeira declaração
break
encontrada. Se não for escrita uma declaração
break
ao final da lista de declarações do case,
o PHP continuará executando as declarações dos próximos
cases. Por exemplo:
Neste exemplo, se a variável $i for igual a 0, o PHP executará todos as
declarações echo! Se a variável $i for igual a 1, o PHP executará as duas
últimas declarações echo. Somente se obterá o comportamento esperado ('i equals 2'
será exibido), se $i for igual a 2. Sendo assim,
é importante não esquecer as declarações break
(mesmo quando se quer evitar, de propósito, sua omissão em
certas circunstâncias).
Em uma declaração switch
, a condição é
avaliada somente uma vez, e o resultado é comparado a cada
declaração case
. Em uma declaração elseif
.
a condição é avaliada outra vez. Se a condição for
mais complicada que uma simples comparação e/ou está em um laço pequeno,
a declaração switch
pode ser mais rápida.
A lista de declarações de um case também podem estar vazia,
passando o controle da lista de declarações para o próximo case.
Um case especial é o default
. Este case corresponde
a tudo que não foi correspondido pelos outros cases. Por exemplo:
Nota:
Múltiplos casos padrões irão emitir um
erro E_COMPILE_ERROR
.
Nota:
Tecnicamente o caso default
pode ser listado
em qualquer ordem. Ele será usado apenas se nenhum outro caso corresponder.
No entando, por conversão, é melhor inseri-lo no fim como a
última ramificação.
Se nenhuma ramificação case
corresponder, e não existe nenhuma ramificação
default
, então nenhum código será executado, assim como se nenhuma declaração if
fosse verdadeira.
Um valor de caso pode ser dado como uma expressão. No entanto, essa expressão será
avaliada de forma isolada, e então será frouxamente comparada com o valor do switch. Isso significa que
ela não pode ser usada para avaliações complexas do valor do switch. Por exemplo:
Para comparações mais complexas, o valor true
pode ser usado como o valor do switch.
Ou, alternativamente, if
-else
em vez do switch
.
A sintaxe alternativa das estruturas de controle é suportada por
switches. Para mais informações, veja Sintaxe alternativa
para estruturas de controle.
É possível utilizar o ponto e vírgula ao invés dos dois pontos em um case, como: