Instrução switch no PHP com case e default
A instrução switch do PHP compara uma expressão com uma lista de valores case e executa o primeiro ramo correspondente. Use-a quando uma variável assume uma entre várias opções fixas e cada opção dispara uma lógica diferente. Agrupar vários rótulos case (cada um sendo uma instrução case do PHP) no mesmo ramo evita condições repetidas em cadeias longas de if/elseif.
Exemplo de switch no PHP para correspondência de valores
Saída:
A saída aparecerá aqui...
Saída:
Escrever recurso
Como este exemplo funciona
switch ($metodo)avalia$metodouma vez e compara o resultado com cada valorcaseusando comparação frouxa (==).case "GET"não corresponde a"POST", então a execução avança para o próximo case.case "POST"corresponde. Como não hábreakapós esse rótulo, a execução continua no bloco decase "PUT"— isso agrupa os dois métodos no mesmo ramo.breaksai do switch após imprimir. Sem ele, a execução continuaria atédefault.defaultfunciona como captura geral quando nenhum case corresponde. É opcional, mas recomendado para código defensivo.
O switch do PHP usa comparação estrita ou frouxa?
O switch do PHP usa comparação frouxa (==), então os valores podem ser convertidos durante a correspondência. Uma armadilha comum é "0" corresponder a case 0, e false também corresponder a case 0. A ordem dos cases importa: vence a primeira correspondência frouxamente igual. Quando comparação estrita importa, use match (PHP 8+) ou if/elseif explícito com ===.
Erros comuns no switch do PHP
break ausente (fall-through acidental):
Errado:
$papel = "admin";
switch ($papel) {
case "admin":
$rotulo = "admin";
case "editor":
$rotulo = "editor";
break;
}
Certo:
$papel = "admin";
switch ($papel) {
case "admin":
$rotulo = "admin";
break;
case "editor":
$rotulo = "editor";
break;
}
Sem break, um case correspondente continua executando os ramos seguintes. O fall-through intencional deve agrupar rótulos sem código entre eles.
Usar continue dentro de um loop esperando pular para a próxima iteração:
Errado:
$itens = ["manter", "pular", "manter"];
foreach ($itens as $item) {
switch ($item) {
case "pular":
continue; // sai do switch, não do loop
}
echo $item . "\\n";
}
Certo:
$itens = ["manter", "pular", "manter"];
foreach ($itens as $item) {
switch ($item) {
case "pular":
continue 2; // avança o foreach
}
echo $item . "\\n";
}
Dentro de um switch aninhado em um loop, continue se comporta como break para o switch. Use continue 2 para atingir o loop externo.
Switch do PHP vs expressão match
| switch | match (PHP 8+) |
|---|---|
| Instrução — não retorna valor | Expressão — retorna um valor |
Comparação frouxa (==) | Comparação estrita (===) |
| Fall-through por padrão | Sem fall-through; cada braço retorna |
| Suporta blocos com várias linhas por case | Uma expressão por braço |
Use switch quando os ramos tiverem várias instruções ou quando o fall-through intencional agrupar cases. Use match ao mapear um valor para um resultado com segurança estrita de tipos.
FAQ
Por que break é necessário em uma instrução switch no PHP?
O switch do PHP usa fall-through por padrão: depois que um case corresponde, todos os ramos seguintes executam até um break ou o fim do bloco switch. A instrução break encerra o switch imediatamente. Omiti-la só é seguro quando você agrupa cases intencionalmente para compartilhar a mesma lógica.
Quando devo usar match em vez de switch no PHP 8+?
Prefira match quando você precisar de comparação estrita, quiser atribuir o resultado a uma variável ou tiver uma expressão por ramo. Fique com switch quando os ramos contiverem várias instruções, efeitos colaterais ou fall-through deliberado entre cases.