Aprender PHP

Assine o RSS

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:

  1. Ler a entrada, o número que o expectador escolheu
  2. De acordo com o número que o expectador escolheu retornar um prêmio
  3. 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.

Diagrama de blocos do switch

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 de break, 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 e else. 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 o if
  • O : inicia o bloco que pode ser lido como else.
  • O valor retornado pode ser atribuído a uma variável.

Comentários

comments powered by Disqus