Aprender PHP

Assine o RSS

O switch e o operador ternário no PHP

Criado em: 25/05/2010 08:31:50

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.

Ultima alteração em: 25/05/2010 08:35:44

Comentários

Duodraco em 25/05/2010

Curti a abordagem.
Vale lembrar que o switch aceita que tanto o "teste" quanto os cases podem receber expressões, tal como o exemplo:
<?php
switch(true){
case ($idade < 18): echo 'Volta pro colegio'; break;
case ($idade >= 18 && $idade < 22): echo 'começando a vida, hein?'; break;
case ($idade > 60): echo 'Não acha que está velho demais pra isso? quer um comprimidinho azul?'; break;
default: echo 'FREE ACCESS :D'; break;
}
e que a partir do PHP 5.3 o operador ternário aceita que omitamos o segundo operando, assumindo que caso a condição retorne false (ou seja considerada false, como no caso de um null), ele assume o valor de false, caso contrário usa o próprio valor. como no exemplo:
<?php
$idade = (isset($idade) && $idade)?:61; // se idade existir e for um valor considerado true, esse valor será usado, do contrário, será 61

Flavio em 29/05/2010

Muito bom o site, quando vamos utilizar dados do banco?

Mauro em 01/06/2010

Flavio, ainda temos alguns assuntos a serem abordados antes do banco de dados mais teremos artigos sobre banco de dados sim.

Rodnei em 05/06/2010

Olá Mauro, sou estudante nato de php, mais pela minha experiência na escola, o php é um verdadeiro c-like...não muda quase nada, pouca coisa. Estou ancioso pelos próximos artigos ... e o comentário do Duodraco é muito bom na parte onde ele fala que pode ser usado comparação junto ao case ... já sobre o operador ternário que ele citou bastava apenas usar uma comparação simples ... eu mesmo não entendi o (isset($idade) && $idade) ... seria como eu colocar aqui fgets(nome,40,stdin); .. muita gente não vai entender /// mais a msg que ele quis passar ficou bem clara. Parabéns pelo post...cadê ? .. quero mais conhecimento =p

Mauro em 14/06/2010

Opa Rodnei, excelente ser um estudante de PHP. Que bom que está ancioso pelos próximos artigos, estou iniciando o próximo pois estive sem tempo, mais assina o feed aí que quando tiver online você fica sabendo.

Abraço

Douglas em 15/06/2010

Como se faz um Switch utilizando duas variaveis
$a;
$b;
switch($a,$b)
{
case $a=1 AND $b=1: echo "resultado 1";break;

case $a=1 AND $b=1: echo "resultado 2";brea2;
}

como se faz isso?
abç

Rodnei(OneSr) em 19/06/2010

Cara você pode fazer como você fez mesmo, só que setar $a,$b ficou meio sem lógica .. basta entrar um uma operação e comparar os valores ...

<?php
$a = 1;
$b = 2;
switch($a){
case ($a=1 AND $b=2): echo "resultado 1";break;
case ($a=1 AND $b=1): echo "resultado 2";break;
default: echo "Nada pode ser comparado";break;
}
?>

Rodnei(OneSr) em 19/06/2010

Ops ... o acima está errado .. aqui como o Duodraco dice .. fica melhor ...

<?php
switch(true){
case ($idade < 18): echo 'Volta pro colegio'; break;
case ($idade >= 18 && $idade < 22): echo 'começando a vida, hein?'; break;
case ($idade > 60): echo 'Não acha que está velho demais pra isso? quer um comprimidinho azul?'; break;
default: echo 'FREE ACCESS :D'; break;
}

Gustavo em 26/04/2011

Nossa! O site é realmente muito bom! Os tutoriais ? Sem comentários...
Sem mais,

Parabéns!

gleyton em 10/08/2011

muito bom esse site esta de parabens me ajudou muito.

Adicionar Comentário