switch

(PHP 4, PHP 5, PHP 7, PHP 8)

A declaração switch é similar a uma série de declarações IF na mesma expressão. Em muitos casos, se deseja comparar as mesmas variáveis (ou expressões), com diferentes valores, e executar pedaços diferentes de código dependendo de qual valor ela é igual. Esta é exatamente a serventia da declaração switch.

Note: Note que ao contrário de outras linguagens, a declaração continue aplica-se ao switch e age similarmente ao break. Se possuir um switch dentro de um laço, e deseja continuar na próxima iteração do laço externo, utilize continue 2.

Note:

Note que o switch/case faz comparação frouxa.

No exemplo a seguir, cada bloco de código é equivalente. Um usa uma série de declarações if e elseif, e o outra usa uma declaração switch. A saída é a mesm a em ambos os casos.

Example #1 Estrutura do switch

<?php
// Esta declaração switch:

switch ($i) {
    case 0:
        echo "i é igual a 0";
        break;
    case 1:
        echo "i é igual a 1";
        break;
    case 2:
        echo "i é igual a 2";
        break;
}

// É equivalente a:

if ($i == 0) {
    echo "i é igual a 0";
} elseif ($i == 1) {
    echo "i é igual a 1";
} elseif ($i == 2) {
    echo "i é igual a 2";
}
?>

É importante entender como a declaração switch é executada a fim de evitar enganos. A declação switch executa linha por linha (na verdade, declaração por declaração). No início nenhum código é executado. Somente quando uma declaração case é encontrada, cuja expressão avalia um valor que corresponde ao valor do switch, o PHP começará a executar a declaração. O PHP continuará a executar a declaração até o fim do bloco switch, ou até a primeira declaração break encontrada. Se não for escrita uma declaração break ao final da lista de declarações do case, o PHP continuará executando as declarações dos próximos cases. Por exemplo:

<?php
switch ($i) {
    case 0:
        echo "i é igual a 0";
    case 1:
        echo "i é igual a 1";
    case 2:
        echo "i é igual a 2";
}
?>

Neste exemplo, se a variável $i for igual a 0, o PHP executará todos as declarações echo! Se a variável $i for igual a 1, o PHP executará as duas últimas declarações echo. Somente se obterá o comportamento esperado ('i equals 2' será exibido), se $i for igual a 2. Sendo assim, é importante não esquecer as declarações break (mesmo quando se quer evitar, de propósito, sua omissão em certas circunstâncias).

Em uma declaração switch, a condição é avaliada somente uma vez, e o resultado é comparado a cada declaração case. Em uma declaração elseif. a condição é avaliada outra vez. Se a condição for mais complicada que uma simples comparação e/ou está em um laço pequeno, a declaração switch pode ser mais rápida.

A lista de declarações de um case também podem estar vazia, passando o controle da lista de declarações para o próximo case.

<?php
switch ($i) {
    case 0:
    case 1:
    case 2:
        echo "i é menor que 3 mas não é negativo";
        break;
    case 3:
        echo "i é 3";
}
?>

Um case especial é o default. Este case corresponde a tudo que não foi correspondido pelos outros cases. Por exemplo:

<?php
switch ($i) {
    case 0:
        echo "i é igual a 0";
        break;
    case 1:
        echo "i é igual a 1";
        break;
    case 2:
        echo "i é igual a 2";
        break;
    default:
       echo "i não é igual a 0, 1 ou 2";
}
?>

Note: Múltiplos casos padrões irão emitir um erro E_COMPILE_ERROR.

Note: Tecnicamente o caso default pode ser listado em qualquer ordem. Ele será usado apenas se nenhum outro caso corresponder. No entando, por conversão, é melhor inseri-lo no fim como a última ramificação.

Se nenhuma ramificação case corresponder, e não existe nenhuma ramificação default, então nenhum código será executado, assim como se nenhuma declaração if fosse verdadeira.

Um valor de caso pode ser dado como uma expressão. No entanto, essa expressão será avaliada de forma isolada, e então será frouxamente comparada com o valor do switch. Isso significa que ela não pode ser usada para avaliações complexas do valor do switch. Por exemplo:

<?php
$alvo = 1;
$inicio = 3;

switch ($alvo) {
    case $inicio - 1:
        print "A";
        break;
    case $inicio - 2:
        print "B";
        break;
    case $inicio - 3:
        print "C";
        break;
    case $inicio - 4:
        print "D";
        break;
}

// Imprime "B"
?>

Para comparações mais complexas, o valor true pode ser usado como o valor do switch. Ou, alternativamente, if-else em vez do switch.

<?php
$deslocamento = 1;
$inicio = 3;

switch (true) {
    case $inicio - $deslocamento === 1:
        print "A";
        break;
    case $inicio - $deslocamento === 2:
        print "B";
        break;
    case $inicio - $deslocamento === 3:
        print "C";
        break;
    case $inicio - $deslocamento === 4:
        print "D";
        break;
}

// Imprime "B"
?>

A sintaxe alternativa das estruturas de controle é suportada por switches. Para mais informações, veja Sintaxe alternativa para estruturas de controle.

<?php
switch ($i):
    case 0:
        echo "i é igual a 0";
        break;
    case 1:
        echo "i é igual a 1";
        break;
    case 2:
        echo "i é igual a 2";
        break;
    default:
        echo "i não é igual a 0, 1 ou 2";
endswitch;
?>

É possível utilizar o ponto e vírgula ao invés dos dois pontos em um case, como:

<?php
switch($cerveja)
{
    case 'amstel';
    case 'brahma';
    case 'stella';
    case 'heineken';
        echo 'Boa escolha';
        break;
    default;
        echo 'Por favor faça uma nova seleção...';
        break;
}
?>

Veja Também