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 match ao switch quando precisar de comparação estrita e retorno de valor.
  • Evite elseif muito profundos; considere usar switch ou match se houver muitas condições.
  • Sempre inclua um default no switch e match para tratar casos inesperados.
  • Use a sintaxe alternativa em templates para melhorar a legibilidade.

Referências

Exercícios

  1. 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";
    }
    ?>
  2. Escreva um código usando switch que 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";
    }
    ?>
  3. 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;
    ?>
  4. 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>
  5. Explique a diferença entre switch e match em PHP 8.

    ✓ Resposta:

    O switch é uma estrutura de controle que executa blocos de código, enquanto match é uma expressão que retorna um valor. match usa comparação estrita (===), enquanto switch usa comparação frouxa (==). Em match, não é necessário usar break para evitar fall-through; cada braço é independente. Além disso, match lança uma exceção se nenhum braço corresponder e não houver default, enquanto switch simplesmente ignora.