Controle de fluxo
Esta aula aborda as estruturas de controle de fluxo em PHP, incluindo if/else/elseif, switch, match (PHP 8) e a sintaxe alternativa para templates. O objetivo é capacitar o aluno a tomar decisões no código de forma eficiente e legível.
O controle de fluxo é um dos pilares da programação, permitindo que seu código tome decisões e execute diferentes blocos de instruções com base em condições. Em PHP, você dispõe de diversas estruturas para isso, desde as clássicas como if e switch até a moderna match introduzida no PHP 8. Nesta aula, vamos explorar cada uma delas em profundidade, com exemplos práticos e boas práticas.
Além disso, veremos a sintaxe alternativa que o PHP oferece para essas estruturas, muito útil quando você precisa misturar HTML e PHP em templates, sem se perder em chaves e parênteses.
if/else/elseif
A estrutura if é a mais básica para controle de fluxo. Ela avalia uma expressão booleana e, se verdadeira, executa o bloco de código associado. Você pode encadear múltiplas condições com elseif e fornecer um bloco padrão com else.
Exemplo simples:
<?php
$idade = 18;
if ($idade >= 18) {
echo "Você é maior de idade.";
} else {
echo "Você é menor de idade.";
}
?>Com elseif:
<?php
$nota = 85;
if ($nota >= 90) {
echo "Conceito A";
} elseif ($nota >= 80) {
echo "Conceito B";
} elseif ($nota >= 70) {
echo "Conceito C";
} else {
echo "Conceito D";
}
?>Note que o elseif é escrito junto (uma palavra) em PHP. Também é possível usar else if (separado), mas o comportamento é idêntico. A diferença é que elseif é preferido por clareza e por ser uma única construção.
switch
O switch é útil quando você precisa comparar uma variável contra muitos valores diferentes. Ele é semelhante a uma série de declarações if encadeadas, mas com uma sintaxe mais limpa para múltiplas comparações de igualdade.
Exemplo:
<?php
$cor = "vermelho";
switch ($cor) {
case "vermelho":
echo "A cor é vermelha.";
break;
case "azul":
echo "A cor é azul.";
break;
case "verde":
echo "A cor é verde.";
break;
default:
echo "Cor desconhecida.";
}
?>É importante lembrar do break após cada case para evitar que a execução continue para o próximo caso (fall-through). Se você quiser que vários casos compartilhem o mesmo bloco, pode omitir o break intencionalmente, mas isso é raro e pode causar bugs se não for documentado.
O switch usa comparação frouxa (==), o que significa que ele não verifica o tipo. Por exemplo, switch ("1") corresponde ao case 1.
match (PHP 8)
O match é uma expressão introduzida no PHP 8 que funciona de forma semelhante ao switch, mas com diferenças importantes: ele retorna um valor, usa comparação estrita (===) e não requer break. Além disso, ele é uma expressão, o que significa que pode ser atribuído a uma variável.
Exemplo:
<?php
$cor = "vermelho";
$mensagem = match ($cor) {
"vermelho" => "A cor é vermelha.",
"azul" => "A cor é azul.",
"verde" => "A cor é verde.",
default => "Cor desconhecida.",
};
echo $mensagem;
?>Observe a sintaxe: cada braço é uma expressão separada por =>. Não há break porque o match executa apenas o primeiro braço que corresponde. Além disso, se nenhum braço corresponder e não houver default, uma exceção UnhandledMatchError é lançada.
O match também pode trabalhar com múltiplos valores em um braço usando vírgula:
<?php
$valor = 2;
$resultado = match ($valor) {
1, 2, 3 => "Baixo",
4, 5, 6 => "Médio",
7, 8, 9 => "Alto",
default => "Fora da faixa",
};
echo $resultado; // Baixo
?>Sintaxe alternativa para templates
O PHP oferece uma sintaxe alternativa para estruturas de controle que é especialmente útil quando você está misturando PHP com HTML em templates. Em vez de usar chaves, você usa dois pontos (:) após a condição e fecha com endif, endswitch, etc.
Exemplo com if:
<?php if ($idade >= 18): ?>
<p>Você é maior de idade.</p>
<?php else: ?>
<p>Você é menor de idade.</p>
<?php endif; ?>Com switch:
<?php switch ($cor): ?>
<?php case "vermelho": ?>
<p>A cor é vermelha.</p>
<?php break; ?>
<?php case "azul": ?>
<p>A cor é azul.</p>
<?php break; ?>
<?php default: ?>
<p>Cor desconhecida.</p>
<?php endswitch; ?>Essa sintaxe é muito utilizada em frameworks como WordPress e Laravel (Blade usa algo similar) porque torna o código mais legível quando há muito HTML. Lembre-se de que a sintaxe alternativa funciona com if, while, for, foreach, e switch.
Boas práticas
- Prefira
matchaoswitchquando precisar de comparação estrita e retorno de valor. - Evite
elseifmuito profundos; considere usarswitchoumatchse houver muitas condições. - Sempre inclua um
defaultnoswitchematchpara tratar casos inesperados. - Use a sintaxe alternativa em templates para melhorar a legibilidade.
Referências
- PHP: if - Manual
- PHP: elseif - Manual
- PHP: switch - Manual
- PHP: match - Manual
- PHP: Sintaxe alternativa - Manual
- PHP: Operadores de comparação - Manual
Exercícios
Crie um script PHP que verifica se um número é positivo, negativo ou zero usando
if/elseif/else.✓ Resposta:<?php $numero = -5; if ($numero > 0) { echo "Positivo"; } elseif ($numero < 0) { echo "Negativo"; } else { echo "Zero"; } ?>Escreva um código usando
switchque exiba o dia da semana (segunda a domingo) com base em um número de 1 a 7.✓ Resposta:<?php $dia = 3; switch ($dia) { case 1: echo "Segunda-feira"; break; case 2: echo "Terça-feira"; break; case 3: echo "Quarta-feira"; break; case 4: echo "Quinta-feira"; break; case 5: echo "Sexta-feira"; break; case 6: echo "Sábado"; break; case 7: echo "Domingo"; break; default: echo "Número inválido"; } ?>Reescreva o exercício anterior usando
match(PHP 8).✓ Resposta:<?php $dia = 3; $nomeDia = match ($dia) { 1 => "Segunda-feira", 2 => "Terça-feira", 3 => "Quarta-feira", 4 => "Quinta-feira", 5 => "Sexta-feira", 6 => "Sábado", 7 => "Domingo", default => "Número inválido", }; echo $nomeDia; ?>Utilizando a sintaxe alternativa, crie um template HTML que exiba uma mensagem de boas-vindas se o usuário estiver logado, ou um link de login caso contrário.
✓ Resposta:<?php $logado = true; ?> <!DOCTYPE html> <html> <head> <title>Exemplo</title> </head> <body> <?php if ($logado): ?> <h1>Bem-vindo!</h1> <?php else: ?> <a href="login.php">Faça login</a> <?php endif; ?> </body> </html>Explique a diferença entre
switchematchem PHP 8.✓ Resposta:O
switché uma estrutura de controle que executa blocos de código, enquantomatché uma expressão que retorna um valor.matchusa comparação estrita (===), enquantoswitchusa comparação frouxa (==). Emmatch, não é necessário usarbreakpara evitar fall-through; cada braço é independente. Além disso,matchlança uma exceção se nenhum braço corresponder e não houverdefault, enquantoswitchsimplesmente ignora.