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.
| $a == $b | 0 | 1 | "0" | "1" | "" | null | false | true | "a" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | |||||||||||
| 1 | |||||||||||
| "0" | |||||||||||
| "1" | |||||||||||
| "" | |||||||||||
| null | |||||||||||
| false | |||||||||||
| true | |||||||||||
| "a" | |||||||||||
| "10" | |||||||||||
| "1e1" |
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.