W3docs

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: Winter

Exemplos

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ções if quando 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

Prática

Prática
De acordo com o conteúdo da página em w3docs.com, em quais circunstâncias uma instrução 'switch' pode ser usada em PHP?
De acordo com o conteúdo da página em w3docs.com, em quais circunstâncias uma instrução 'switch' pode ser usada em PHP?
Was this page helpful?