Na aula anterior aprendemos a utilizar if, else e elseif para fazer com que um programa tome decisões.
Por exemplo:
Mas existem situações em que não queremos verificar intervalos ou condições complexas. Queremos simplesmente comparar o mesmo valor com várias possibilidades.
Imagine que temos uma variável com o número do dia da semana:
$dia = 3;
e pretendemos apresentar:
Poderíamos resolver o problema utilizando vários elseif, mas o PHP disponibiliza uma estrutura especialmente adequada a este tipo de situação: o switch.
1. Quando existem várias possibilidades
Considere:
$dia = 3;
Utilizando apenas aquilo que já conhecemos, poderíamos escrever:
Funciona corretamente.
No entanto, estamos constantemente a comparar a mesma variável:
$dia
com diferentes valores:
Nestes casos podemos utilizar switch.
2. A estrutura switch
A estrutura básica é:
O switch analisa o valor da variável e procura um case correspondente.
3. Primeiro exemplo
Vamos reescrever o exemplo anterior:
Como:
$dia = 3
o PHP encontra:
case 3:
e executa:
echo "Quarta-feira";
Resultado:
Quarta-feira
4. Como funciona o switch?
Podemos imaginar o processo desta forma:
O PHP compara o valor analisado com os diferentes case.
Quando encontra uma correspondência, executa as instruções associadas.
5. O que é case?
Cada case representa uma das possibilidades.
Podemos interpretar como:
Caso o valor seja
1, apresenta "Segunda-feira".
Outro exemplo:
significa:
Caso o valor seja
5, apresenta "Sexta-feira".
6. Para que serve break?
Observe:
O break indica que o PHP deve sair do switch depois de executar esse case.
É uma instrução muito importante.
Considere este código:
O resultado será:
Editar
Depois de executar o case 2, o break termina o switch.
7. O que acontece se esquecermos o break?
Considere:
O PHP encontra:
case 2:
e apresenta:
Editar
Mas, como não existe break, continua para o próximo case.
Resultado:
Este comportamento chama-se fall-through.
Por enquanto, vamos adotar como regra:
Sempre que terminarmos um
case, colocamosbreak, exceto quando pretendemos deliberadamente que a execução continue para ocaseseguinte.
8. O default
E se nenhum dos valores corresponder?
Considere:
$dia = 9;
Não existe:
case 9:
É aqui que utilizamos:
default:
Exemplo:
Resultado:
Dia inválido
O default desempenha um papel semelhante ao else.
Podemos pensar:
Não são exatamente a mesma estrutura, mas esta comparação ajuda a compreender a função de cada elemento.
9. O switch também pode trabalhar com texto
Os case não têm de ser números.
Por exemplo:
Resultado:
A encomenda foi enviada.
Este exemplo aproxima-nos de situações que poderemos encontrar mais tarde numa aplicação ligada a uma base de dados.
10. Exemplo — Menu de uma aplicação
Imagine que o utilizador escolheu uma opção:
$opcao = 3;
Temos:
Podemos escrever:
Para:
$opcao = 3;
obtemos:
Editar registo
11. Vários case com a mesma ação
Por vezes vários valores devem produzir o mesmo resultado.
Imagine:
Podemos escrever:
Para:
$dia = 6;
obtemos:
Fim de semana
12. if...elseif ou switch?
Esta é a parte que considero mais importante da aula.
As duas estruturas permitem tomar decisões, mas não são adequadas exatamente às mesmas situações.
if...elseif
É especialmente útil quando trabalhamos com:
- intervalos;
- comparações diferentes;
- operadores
>,<,>=,<=; - várias condições combinadas;
&&e||.
Exemplo:
Aqui estamos a trabalhar com intervalos de valores.
O if...elseif é a escolha mais natural.
switch
É particularmente útil quando queremos comparar uma expressão com vários valores concretos.
Por exemplo:
Neste caso:
switch ($opcao) {
torna o código mais organizado.
13. Escolher a estrutura adequada
Considere estes problemas.
Situação A
Se a idade for igual ou superior a 18, apresentar "Maior de idade".
Melhor escolha:
if
porque estamos a utilizar:
>=
Situação B
Dependendo do número 1, 2, 3 ou 4, apresentar uma opção diferente.
Melhor escolha:
switch
porque estamos a comparar o mesmo valor com várias possibilidades concretas.
Situação C
Média >= 18, >= 14, >= 10 ou inferior a 10.
Melhor escolha:
if / elseif / else
porque existem intervalos.
Situação D
Estado = "pendente", "pago", "enviado" ou "entregue".
Uma boa escolha:
switch
porque temos valores específicos.
14. Nem tudo deve ser transformado num switch
Não devemos utilizar uma estrutura apenas porque acabámos de a aprender.
Por exemplo:
$stock = 7;
Queremos saber:
stock > 0?
A solução natural continua a ser:
O objetivo não é substituir o if.
O objetivo é saber qual a ferramenta mais adequada para cada problema.
15. Exemplo completo — Estado de uma encomenda
Considere:
Podemos criar:
Alterando apenas:
$estado = "enviado";
a página passa a apresentar:
A encomenda está a caminho.
Mais uma vez, os dados mudam e o programa adapta o comportamento.
16. Consolidar if, elseif e else
Antes de terminar a matéria das condições, vamos rever uma situação um pouco mais complexa.
Imagine:
Queremos:
Podemos resolver:
Repare que não precisamos obrigatoriamente de criar condições aninhadas.
À medida que ganhamos experiência, devemos procurar soluções simples e fáceis de compreender.