(PHP 4, PHP 5, PHP 7)
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.
Versão | Descrição |
---|---|
7.0.0 |
Múltiplos cases default lançarão um erro E_COMPILE_ERROR .
|
Os dois exemplos a seguir demonstram duas formas diferentes de escrever a mesma coisa, uma usando uma série de declarações if e elseif, e a outra usando a declaração switch:
Exemplo #1 Estrutura do switch
<?php
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
?>
Exemplo #2 A estrutura do switch permite o uso de strings
<?php
switch ($i) {
case "apple":
echo "i is apple";
break;
case "bar":
echo "i is bar";
break;
case "cake":
echo "i is cake";
break;
}
?>
É 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 com um valores correspondente ao valor da expressão 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 equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 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 is less than 3 but not negative";
break;
case 3:
echo "i is 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 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";
}
?>
A expressão casepode ser qualquer expressão que avalie um tipo simples, isto é, integer ou número de ponto flutuante e strings. Arrays or objects não podem ser utilizados a não que referenciados para um tipo simples.
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 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;
?>
É possível utilizar o ponto e vírgula ao invés dos dois pontos em um case, como:
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'heineken';
echo 'Good choice';
break;
default;
echo 'Please make a new selection...';
break;
}
?>