Menu

PHP switch case: casos, break e fallthrough

switch ($value) compara um valor com uma lista de rótulos case e executa o código a partir do primeiro que bate até um break. Veja vários cases, fallthrough, default, switch(true) e por que o switch usa a comparação frouxa ==.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

switch ($value) compara um valor com uma lista de rótulos case e executa o código abaixo do primeiro rótulo que bate. Cada case termina com break; default trata tudo o que não bateu com nenhum.

Defina $day como 'fri', 'sun' ou 'wed' e rode de novo. O case default não precisa de break quando é o último.

Vários cases para um bloco

Para executar o mesmo código para vários valores, empilhe os rótulos case sem nada entre eles. Um rótulo que bate continua no código abaixo dele.

Ao contrário do match, o switch não tem a sintaxe com vírgula case 'jpg', 'jpeg':. Empilhar rótulos é o único jeito.

Fallthrough: o que acontece sem break

O break é o que encerra um switch. Sem ele, o PHP executa o case que bateu e continua por todos os cases abaixo, ignorando os rótulos, até encontrar um break ou o fim.

Aqui o fallthrough é proposital: cada plano recebe os próprios recursos mais tudo dos planos mais baratos. Quando você o escrever de propósito, adicione um comentário como // no break para que quem ler depois não o "corrija". Quando não foi a intenção, um break faltando é um dos bugs mais comuns de switch.

O switch usa comparação frouxa (==)

Cada case é verificado com ==, não com ===. Uma string numérica bate com um número, null bate com false e "", e true bate com qualquer valor que conta como verdadeiro. Toque nas células para comparar os dois operadores.

switch compara com ==, match compara com ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

A consequência prática: uma string "1" vinda de um formulário cai em case 1: sem conversão nenhuma, o que muitas vezes é o que você quer. Mas switch (true) com uma string não vazia, ou null encontrando case false:, pode escolher um case inesperado.

Repare na linha do null: ele nunca chega a case false:, porque null == 0 já é verdadeiro e case 0: vem antes. Com comparação frouxa, a ordem dos cases muda o resultado. Desde o PHP 8, 0 == "a" é falso (no PHP 7 era verdadeiro), então uma string não numérica não bate mais com case 0:. Se você precisa de ===, use uma expressão match, explicada no fim desta página.

switch(true) para intervalos e condições

Um rótulo case pode ser qualquer expressão. Com switch (true), cada case é uma condição, e a primeira que for igual a true vence.

Garanta que cada case seja um booleano de verdade. Por causa da comparação frouxa, case $name: bateria sempre que $name fosse uma string não vazia.

switch dentro de um loop: break e continue

Dentro de um loop, o break num switch só sai do switch, não do loop. Para encerrar o loop, use break 2. continue dentro de um switch se comporta como break, e o PHP avisa em tempo de compilação: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Escreva continue 2 para pular para a próxima iteração do loop.

switch ou match

O PHP 8 adicionou o match, que cobre a maioria dos usos do switch com menos código. Ele compara com ===, retorna um valor, nunca cai para o próximo case, aceita condições separadas por vírgula e lança um UnhandledMatchError quando nada bate, então um case esquecido não passa em silêncio.

Mantenha o switch quando um case precisa de várias instruções, ou quando o fallthrough é o objetivo, como no exemplo dos planos. Para mapear um valor para um resultado, o match é mais curto e mais seguro.

Perguntas frequentes

Como uso vários cases para um bloco num switch PHP?

Empilhe os rótulos case sem código entre eles: case 'sat': case 'sun': echo 'weekend'; break;. Cada rótulo segue para o código compartilhado. O PHP não tem a sintaxe case 'sat', 'sun': para switch; essa forma com vírgula é do match.

O switch do PHP usa comparação estrita?

Não. O switch compara com o == frouxo, então case '1': bate com o inteiro 1 e case 0: bate com '0'. Para comparação estrita com ===, use uma expressão match ou switch (true) com === dentro de cada case.

O que acontece se eu esquecer o break num switch PHP?

A execução continua para baixo: depois do case que bateu, o PHP segue executando o código de todos os cases abaixo até encontrar um break, um return ou o fim do switch. Às vezes isso é intencional, mas normalmente é um bug.

Um switch PHP pode verificar intervalos como maior que?

Sim, com switch (true): cada case contém uma condição como case $score >= 90:, e a primeira que for verdadeira executa. Uma expressão match (true) faz o mesmo com comparação estrita e retorna um valor.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR