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
.
Note: Note que ao contrário de outras linguagens, a declaração continue aplica-se ao
switch
e age similarmente aobreak
. Se possuir umswitch
dentro de um laço, e deseja continuar na próxima iteração do laço externo, utilizecontinue 2
.
Note:
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.
Example #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:
<?php
switch ($i) {
case 0:
echo "i é igual a 0";
case 1:
echo "i é igual a 1";
case 2:
echo "i é igual a 2";
}
?>
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.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i é menor que 3 mas não é negativo";
break;
case 3:
echo "i é 3";
}
?>
Um case especial é o default
. Este case corresponde
a tudo que não foi correspondido pelos outros cases. Por exemplo:
<?php
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;
default:
echo "i não é igual a 0, 1 ou 2";
}
?>
Note: Múltiplos casos padrões irão emitir um erro
E_COMPILE_ERROR
.
Note: 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:
<?php
$alvo = 1;
$inicio = 3;
switch ($alvo) {
case $inicio - 1:
print "A";
break;
case $inicio - 2:
print "B";
break;
case $inicio - 3:
print "C";
break;
case $inicio - 4:
print "D";
break;
}
// Imprime "B"
?>
Para comparações mais complexas, o valor true
pode ser usado como o valor do switch.
Ou, alternativamente, if
-else
em vez do switch
.
<?php
$deslocamento = 1;
$inicio = 3;
switch (true) {
case $inicio - $deslocamento === 1:
print "A";
break;
case $inicio - $deslocamento === 2:
print "B";
break;
case $inicio - $deslocamento === 3:
print "C";
break;
case $inicio - $deslocamento === 4:
print "D";
break;
}
// Imprime "B"
?>
A sintaxe alternativa das estruturas de controle é suportada por switches. Para mais informações, veja Sintaxe alternativa para estruturas de controle.
<?php
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;
default:
echo "i não é igual a 0, 1 ou 2";
endswitch;
?>
É possível utilizar o ponto e vírgula ao invés dos dois pontos em um case, como:
<?php
switch($cerveja)
{
case 'amstel';
case 'brahma';
case 'stella';
case 'heineken';
echo 'Boa escolha';
break;
default;
echo 'Por favor faça uma nova seleção...';
break;
}
?>