switch
Em PHP, a palavra-chave "switch" avalia um valor e executa diferentes ações com base nesse valor. É uma alternativa ao uso de múltiplos "if"
A Instrução switch do PHP
A instrução switch do PHP avalia uma expressão e executa o bloco de código que corresponde ao seu valor. É a alternativa mais limpa a uma longa cadeia de instruções if / elseif / else quando você está comparando a mesma variável contra muitos valores possíveis.
Este capítulo aborda a sintaxe, a importantíssima palavra-chave break, o fall-through intencional, a sintaxe alternativa endswitch e a armadilha de comparação fraca que pega a maioria dos iniciantes de surpresa.
Sintaxe
A sintaxe básica de uma instrução switch em PHP é a seguinte:
<?php
switch ($value) {
case $value1:
// Code block here
break;
case $value2:
// Code block here
break;
default:
// Code block here
}O PHP compara $value com cada case de cima para baixo. A primeira correspondência vence: seu bloco é executado e o break sai do switch. Se nenhum case corresponder, o bloco default opcional é executado. O default não precisa ser o último, mas colocá-lo por último é a convenção que os leitores esperam.
Por que o break importa
A instrução break interrompe a execução e sai do bloco switch. Sem ele, o PHP continua executando o código em todos os cases seguintes até encontrar um break ou o fim do bloco — um comportamento chamado fall-through. Este é o bug mais comum em switch:
<?php
$role = "editor";
switch ($role) {
case "admin":
echo "Full access. ";
// no break — execution "falls through" to the next case
case "editor":
echo "Can edit content. ";
break;
case "viewer":
echo "Read only.";
break;
}
// Output: Can edit content.Aqui editor corresponde, imprime sua mensagem e o break sai corretamente. Esquecer o break após admin faria com que um admin também executasse o código de editor. Veja break para a palavra-chave completa.
Fall-through intencional
O fall-through nem sempre é um erro. Empilhar labels case vazios permite que vários valores compartilhem um bloco — uma maneira limpa de agrupar condições:
<?php
$month = 2;
switch ($month) {
case 12:
case 1:
case 2:
echo "Winter";
break;
case 3:
case 4:
case 5:
echo "Spring";
break;
default:
echo "Another season";
}
// Output: WinterExemplos
Veja alguns exemplos práticos de como o switch é usado:
<?php
// Example 1
$dayOfWeek = "Wednesday";
switch ($dayOfWeek) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
echo "It's a weekday.";
break;
case "Saturday":
case "Sunday":
echo "It's a weekend.";
break;
}
// Example 2
$grade = "B";
switch ($grade) {
case "A":
echo "Excellent!";
break;
case "B":
echo "Good job!";
break;
case "C":
echo "Could do better.";
break;
default:
echo "Please enter a valid grade.";
}O Exemplo 1 agrupa nomes de dias úteis com labels case empilhados para decidir entre dia de semana e fim de semana. O Exemplo 2 mapeia uma letra de nota para uma mensagem de feedback, com default capturando qualquer valor que não corresponda.
A armadilha da comparação fraca
Por padrão, o switch compara com igualdade fraca (==), então os valores são comparados após a conversão de tipos — não com === estrito. Isso pode produzir correspondências surpreendentes:
<?php
$value = "1";
switch ($value) {
case 1:
echo "Matched the integer 1!";
break;
default:
echo "Matched default.";
}
// Output: Matched the integer 1!A string "1" corresponde ao inteiro case 1 porque == converte os tipos antes de comparar. Quando você precisa de verificação estrita de tipos, use uma cadeia de if / elseif com ===, ou use a expressão match (PHP 8+), que compara estritamente e retorna um valor:
<?php
$grade = "B";
$message = match ($grade) {
"A" => "Excellent!",
"B" => "Good job!",
"C" => "Could do better.",
default => "Please enter a valid grade.",
};
echo $message;
// Output: Good job!match não tem fall-through e não precisa de break, o que elimina toda uma classe de bugs.
Sintaxe alternativa endswitch
Ao incorporar PHP em templates HTML, a forma com dois-pontos e endswitch pode ser mais legível:
<?php switch ($status): ?>
<?php case "active": ?>
<span>Active</span>
<?php break; ?>
<?php default: ?>
<span>Inactive</span>
<?php endswitch; ?>Benefícios
- Legibilidade — um
switché mais fácil de analisar do que muitas instruçõesifquando você compara a mesma variável contra vários valores. - Avaliação única — a expressão do switch é avaliada uma vez e depois comparada com cada
case.
Capítulos relacionados
- PHP if...else...elseif — ramificação quando as condições diferem
- PHP break e break vs. continue — controle de fluxo
- PHP operators — comparação e igualdade
- PHP loops — repetição de blocos de código