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

  1. switch ($metodo) avalia $metodo uma vez e compara o resultado com cada valor case usando comparação frouxa (==).
  2. case "GET" não corresponde a "POST", então a execução avança para o próximo case.
  3. case "POST" corresponde. Como não há break após esse rótulo, a execução continua no bloco de case "PUT" — isso agrupa os dois métodos no mesmo ramo.
  4. break sai do switch após imprimir. Sem ele, a execução continuaria até default.
  5. default funciona 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

switchmatch (PHP 8+)
Instrução — não retorna valorExpressão — retorna um valor
Comparação frouxa (==)Comparação estrita (===)
Fall-through por padrãoSem fall-through; cada braço retorna
Suporta blocos com várias linhas por caseUma 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.