O switch e o operador ternário no PHP
Criado em: 25/05/2010
O switch no PHP
O switch funciona como uma série de if
juntos, mais sobre as estruturas de controle if, else e elseif podem ser encontradas no artigo anterior, testando valores para uma variável ou expressão. No entanto o switch trabalha basicamente com o operador de igualdade. Então em casos que devemos testar se nossa variável, ou expressão, é igual a uma série de valores, o switch
é uma boa saída. Vamos agora ver um problema para entendermos melhor o switch
.
Problema
Em um programa de televisão o expectador deve escolher números de 1 a 5 para um sorteio de prêmios, em que cada número representa um prêmio. Então faremos:
- Ler a entrada, o número que o expectador escolheu
- De acordo com o número que o expectador escolheu retornar um prêmio
- Se escolher um numero que não seja de 1 a 5 retornar uma mensagem de erro.
O diagrama de blocos
Observe como seria a representação do nosso problema no diagrama de blocos.
O símbolo de início e entrada de dados não são novidades afinal foram abordados no artigo sobre o algoritmo e diagrama de blocos no PHP, no entanto o símbolo seguinte nos diz que iremos comparar o valor contido nele com os símbolos de decisões seguintes. E como já foi falado no artigo anterior utilizamos as setas para indicar a direção do processamento. Como você pode observar no diagrama será testado cada um dos valores se não for verdadeiro o próximo será testado até o último, chegando no ultimo se nem o último for verdadeiro executamos o default, equivalente a um else.
No PHP
O nosso problema poderia ser resolvido apenas utilizando as estruturas de controle if, else e elseif que aprendemos no artigo anterior. Antes de ver o código abaixo tente resolver o nosso problema apenas com as estruturas de controle que aprendemos até este ponto. Conseguiu? Veja um exemplo de como poderia ser resolvido utilizando apenas if
, else
e elseif
:
<?php /** * Entrada do número do expectador */ $numero = 3; if ( $numero == 1 ){ $mensagem = 'uma bicicleta'; } elseif ( $numero == 2 ) { $mensagem = '20 mil reais em barras de ouro'; } elseif ( $numero == 3 ) { $mensagem = 'uma casa'; } elseif ( $numero == 4 ) { $mensagem = 'um conjunto de panelas'; } elseif ( $numero == 5 ) { $mensagem = 'um carro zero'; } else { $mensagem = 'nada, infelizmente'; } /** * Retornando a mensagem */ echo "Parabéns o seu prêmio foi: {$mensagem}" ; ?>
Não foi muito difícil de resolver né? No entanto observe o código comparamos sempre a variável $numero
a um valor de 1 a 5 e retornávamos uma $mensagem
, e se não fosse de 1 a 5 retornaríamos que ele não ganhou nada. Se estamos sempre comparando uma variável, ou expressão se são iguais a uma série de valores talvez seja à hora de trocarmos de estrutura de controle.
Ao utilizarmos o switch
informamos a variável ou expressão que será testada em cada uma das cláusulas (case
) até que seja encontrada uma cláusula em que seja verdadeira. Quando isto ocorre às instruções dentro do bloco de código da estrutura case é executado até encontrar a instrução break
, falaremos mais sobre break
quando chegarmos aos loops no PHP, se nenhuma cláusula for verdadeira a instrução default
será executada.
<?php /** * Entrada do número do expectador */ $numero = 3; switch ( $numero ){ case 1: $mensagem = 'uma bicicleta'; break; case 2: $mensagem = '20 mil reais em barras de ouro'; break; case 3: $mensagem = 'uma casa'; break; case 4: $mensagem = 'um conjunto de panelas'; break; case 5: $mensagem = 'um carro zero'; break; default: $mensagem = 'nada, infelizmente'; } /** * Retornando a mensagem */ echo "Parabéns o seu prêmio foi: {$mensagem}"; ?>
Voltaremos a falar sobre a instrução break
posteriormente, no entanto até este momento você só deve ter em mente que se ela não for inserida seria como se não fechássemos a instrução case
. Observe o exemplo abaixo mesmo passando um valor e ele for verdadeiro todas as expressões abaixo do valor escolhido são executadas e como atribuímos um valor a variável o que prevalece é da ultima, o default
, por este motivo devemos sempre utilizar a instrução break
.
<?php /** * Entrada do número do expectador */ $numero = 3; switch ( $numero ){ case 1: $mensagem = 'uma bicicleta'; case 2: $mensagem = '20 mil reais em barras de ouro'; case 3: $mensagem = 'uma casa'; case 4: $mensagem = 'um conjunto de panelas'; case 5: $mensagem = 'um carro zero'; default: $mensagem = 'nada, infelizmente'; } /** * Retornando a mensagem */ echo "Parabéns o seu prêmio foi: {$mensagem}" ; ?>
Agora que sabemos o porquê do break
, podemos o aproveitar de uma maneira, por exemplo, se em nosso problema caso a pessoa escolhesse 2 ou 3 o prêmio seria o mesmo. Poderíamos apenas mudar o valor da variável mensagem para eles ficarem iguais, no entanto estaríamos nos repetindo o que não é legal, pois sempre que tivéssemos que alterar em um teríamos que lembrar de alterar no outro por isso. O melhor mesmo é fazer da seguinte forma:
<?php /** * Entrada do número do expectador */ $numero = 2; switch ( $numero ){ case 1: $mensagem = 'uma bicicleta'; break; case 2: case 3: $mensagem = 'uma casa'; break; case 4: $mensagem = 'um conjunto de panelas'; break; case 5: $mensagem = 'um carro zero'; break; default: $mensagem = 'nada, infelizmente'; } /** * Retornando a mensagem */ echo "Parabéns o seu prêmio foi: {$mensagem}" ; ?>
Como o valor que seria mantido era o da cláusula 3 apenas retiramos as instruções da 2 e não colocamos break
na cláusula 2 sendo assim ela seria a mesma que a 3 esta sim tendo a instrução break
como as demais.
Em relação a estrutura de controle switch:
- A variavel ou expressão a ser avaliada é declarada no inicio do
switch
- Expressões são realizadas por operadores lógicos e operadores de comparação
- O bloco de código referente a estrutura de controle deve ser delimitado por chaves
{}
- Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
- Cada cláusula (
case
) possui um valor a ser comparado e logo após o valor são adicionado 2 pontos (:
) dando inicio a clausula - Após os 2 pontos o bloco de código que devera ser executado para aquela cláusula
- Finalizamos a cláusula com o
break
- Caso tenhamos 2 ou mais valores que executarão o mesmo bloco de código não definimos o
break
apenas no ultimo em que for inserido o bloco de código, ver o exemplo anterior - Após todas as cláusulas podemos adicionar uma cláusula
default
que será executada caso todas as outras não tenham sido verdadeiras - A cláusula
default
não necessita debreak
, afinal ela é inserida após todas as outras
Operador ternário
O operador ternário basicamente é uma forma de escrever uma instrução if e else em uma única linha. Para utilizamos o operador ternário utilizamos o ?
e o :
. Observe um exemplo utilizando if
e else
:
<?php $resultado = 7.5; if ( $resultado > 7 ){ echo 'Aprovado'; } else { echo 'Reprovado'; } ?>
Um exemplo bem simples apenas para ilustrar, afinal if e else já aprendemos. Agora o mesmo código poderia ser transcrito com o operador ternário. Observe:
<?php $resultado = 7.5; echo $resultado > 7 ? 'Aprovado' : 'Reprovado'; ?>
Resolvemos o mesmo problema em apenas uma linha. O que vem seguido do ?
representa o if
enquanto o :
representa o else
. Também podemos fazer atribuições utilizando o operador ternário. Observe:
<?php $resultado = 7.5; $mensagem = $resultado > 7 ? 'Aprovado' : 'Reprovado'; echo $mensagem; ?>
Agora a nossa variável $mensagem
recebe o valor de acordo com o resultado utilizando do operador ternário.
Não utilize o operador ternário para substituir sempre as estruturasif e else. O operador ternário deve ser utilizado quando o retorno e a lógica implementada for algo pequeno. Por isso cabe ao desenvolvedor analisar se vale a pena substituir uma instrução if
e else
por um operador ternário ou vice e versa. Pense na legibilidade, pois seu código pode ser lido futuramente por outra pessoa na situação o que seria mais fácil de ler?
Em relação ao operador ternário:
- Equivale a um
if
eelse
. No entanto seu uso deve ser ponderado como pode ser lido anteriormente. - A expressão a ser avaliada é declarada no inicio do operador
- O
?
inicia o bloco que pode ser lido como oif
- O
:
inicia o bloco que pode ser lido comoelse
. - O valor retornado pode ser atribuído a uma variável.