Forum und email

switch

A instrução switch é similar a uma série de instruções IFs seguidas. Em muitas ocasiões, você poderá ter que comparar a mesma variável (ou expressão) com muitos valores diferentes, executando códigos diferentes dependendo com qual valor ele se encaixar. É exatamente para isso que a instrução switch faz.

Nota: Note que diferentemente de outras linguagens, a instrução continue se aplica a switch e age similarmente a um break. Se você tem um switch dentro de um loop e deseja continuar para a próxima iteração do loop, use continue 2.

Nota: Note que switch/case fazem comparações soltas.

Os exemplos seguintes mostram duas maneiras diferentes de escrever a mesma coisa, uma utilizando uma série de ifs e elseifs e a outra utlizando a instrução switch:

Example#1 Estrutura switch

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

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;
}
?>

Example#2 A estrutura switch permite uso de strings

<?php
switch ($i) {
    case 
"apple":
        echo 
"i is apple";
        break;
    case 
"bar":
        echo 
"i is bar";
        break;
    case 
"cake":
        echo 
"i is cake";
        break;
    }
?>

É importante entender como a instrução switch funciona para evitar enganos. A instrução switch executa linha a linha (atualmente, instrução a instrução). No início, nenhum código é executado. Somente quando uma instrução case é encontrada com um valor que combina com a expressão do switch faz com que o PHP execute as instruções a partir daí. O PHP continua executando as instruções até o fim do bloco switch ou na primeira vez que encontrar uma instrução break. Se você não escrever uma instrução break no fim das instruções case, o PHP continuará executando os cases seguintes. 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";
}
?>

Aqui, se $i é igual a zero, o PHP executará todas as instruções echo! Se $i é igual a 1, o PHP executará os últimas duas instruções echo, e somente se $i for igual a 2, você terá o comportamento 'esperado' apenas onde 'i igual a 2' será mostrado. Então é importante não se esquecer das instruções break (e as vezes não colocá-las para obter esse resultado em certas circunstâncias).

Em uma instrução switch, a condição somente será avaliada e resultado comparado para cada instrução case. Em uma instrução elseif, a condição é avaliada novamente. Se sua condição é mais complicada que um simples comparação e/ou e dentro de um loop, um switch é mais rápido.

Um case pode não ter nenhuma instrução dentro, o que simplesmente passa o controle 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. Esse case é executado quando nenhum outro case combina. 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";
}
?>

A expressão avaliada pelo case precisa ser um tipo simples, ou seja, inteiros, números de ponto flutuante e strings. Arrays ou objetos não podem ser utilizados a não ser que eles impliquem num tipo simples.

A sintaxe alternativa para estruturas de controle é suportada para os switches. Para maiores 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;
?>