
Estruturas de controle e funções
Aqui você aprende a dar lógica ao seu código: tomar decisões, repetir tarefas e organizar tudo em funções reutilizáveis. É o capítulo que transforma scripts simples em programas de verdade.
Condicional if / elseif / else
A estrutura mais fundamental de qualquer linguagem:
php
<?php
$temperatura = 32;
if ($temperatura >= 35) {
echo "Calor extremo — beba água!";
} elseif ($temperatura >= 25) {
echo "Dia quente — use protetor solar.";
} elseif ($temperatura >= 15) {
echo "Temperatura agradável.";
} else {
echo "Frio — pegue um casaco.";
}
// Dia quente — use protetor solar.
Quando o bloco tem apenas uma linha, as chaves são opcionais — mas é boa prática sempre usá-las:
php
<?php
$logado = true;
// Sem chaves (evite em blocos maiores)
if ($logado) echo "Bem-vindo!";
// Com chaves (sempre prefira)
if ($logado) {
echo "Bem-vindo!";
}
switch — múltiplas condições no mesmo valor
Quando você compara a mesma variável contra vários valores, switch é mais limpo que vários elseif:
php
<?php
$diaSemana = date('N'); // 1=segunda ... 7=domingo
switch ($diaSemana) {
case 1:
echo "Segunda-feira";
break;
case 2:
echo "Terça-feira";
break;
case 6:
case 7:
// Dois cases no mesmo bloco = compartilham a lógica
echo "Fim de semana!";
break;
default:
echo "Dia útil";
break;
}
Atenção: sem o
break, o PHP continua executando os cases seguintes (comportamento chamado de fall-through). Isso causa bugs difíceis de encontrar.
match — o switch moderno (PHP 8+)
O match é mais seguro e conciso que o switch. Ele usa comparação estrita (===) e sempre retorna um valor:
php
<?php
$status = 2;
$mensagem = match($status) {
1 => "Pendente",
2 => "Aprovado",
3, 4 => "Rejeitado ou cancelado", // múltiplos valores
default => "Status desconhecido",
};
echo $mensagem; // Aprovado
// match lança erro se nenhum caso bater e não houver default
// switch apenas ignora — match é mais seguro
Comparando diretamente:
php
<?php
$val = "1";
// switch usa == (fraco): "1" == 1 é true
switch ($val) {
case 1: echo "switch: entrou aqui!"; break; // ENTROU
}
// match usa === (estrito): "1" !== 1
$r = match($val) {
1 => "inteiro um",
"1" => "string um", // ENTROU aqui
default => "outro",
};
echo $r; // string um
Laço while
Repete enquanto a condição for verdadeira. A condição é verificada antes de cada iteração:
php
<?php
$contador = 1;
while ($contador <= 5) {
echo "Iteração $contador\n";
$contador++;
}
// Iteração 1
// Iteração 2
// Iteração 3
// Iteração 4
// Iteração 5
Laço do...while
Igual ao while, mas a condição é verificada depois — o bloco executa pelo menos uma vez:
php
<?php
$tentativas = 0;
do {
echo "Tentativa " . ($tentativas + 1) . "\n";
$tentativas++;
} while ($tentativas < 3);
// Tentativa 1
// Tentativa 2
// Tentativa 3
// Útil quando você precisa que o bloco rode ao menos uma vez
// antes de checar a condição (ex: menus, validações interativas)
Laço for
Quando você sabe exatamente quantas vezes quer repetir:
php
<?php
// for (inicialização; condição; incremento)
for ($i = 0; $i < 5; $i++) {
echo "Item $i\n";
}
// Contagem regressiva
for ($i = 10; $i >= 0; $i--) {
echo "$i ";
}
echo "\n"; // 10 9 8 7 6 5 4 3 2 1 0
// Incremento diferente de 1
for ($i = 0; $i <= 100; $i += 25) {
echo "$i% ";
}
// 0% 25% 50% 75% 100%
// Tabuada do 7
for ($i = 1; $i <= 10; $i++) {
echo "7 x $i = " . (7 * $i) . "\n";
}
Laço foreach
Feito especialmente para percorrer arrays. É o mais usado no dia a dia:
php
<?php
// Array indexado
$frutas = ["maçã", "banana", "uva", "laranja"];
foreach ($frutas as $fruta) {
echo "- $fruta\n";
}
// - maçã
// - banana
// - uva
// - laranja
// Array associativo: acessa chave E valor
$pessoa = [
"nome" => "Carlos",
"idade" => 30,
"cidade"=> "São Paulo",
];
foreach ($pessoa as $chave => $valor) {
echo "$chave: $valor\n";
}
// nome: Carlos
// idade: 30
// cidade: São Paulo
// Array multidimensional
$alunos = [
["nome" => "Ana", "nota" => 9.5],
["nome" => "Bruno", "nota" => 7.2],
["nome" => "Carla", "nota" => 8.8],
];
foreach ($alunos as $aluno) {
echo "{$aluno['nome']}: {$aluno['nota']}\n";
}
break e continue
Controlam o fluxo dentro de laços:
php
<?php
// break: para o laço completamente
for ($i = 1; $i <= 10; $i++) {
if ($i === 5) {
echo "Parou no $i!\n";
break;
}
echo "$i ";
}
// 1 2 3 4 Parou no 5!
// continue: pula para a próxima iteração
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 === 0) continue; // pula os pares
echo "$i ";
}
// 1 3 5 7 9
// break com nível: sai de laços aninhados
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 3; $j++) {
if ($j === 1) break 2; // sai dos 2 laços
echo "$i,$j ";
}
}
// 0,0
Funções — declaração e chamada
Funções agrupam código reutilizável com um nome:
php
<?php
// Declaração
function saudar(string $nome): string {
return "Olá, $nome!";
}
// Chamada
echo saudar("Maria"); // Olá, Maria!
echo saudar("João"); // Olá, João!
// Em PHP, funções podem ser chamadas ANTES de serem declaradas
// (ao contrário de variáveis e closures)
echo dobrar(5); // 10
function dobrar(int $n): int {
return $n * 2;
}
Parâmetros e valores padrão
php
<?php
// Parâmetros com valor padrão ficam sempre no final
function criarUsuario(
string $nome,
int $idade,
string $perfil = "visitante", // padrão
bool $ativo = true // padrão
): string {
$status = $ativo ? "ativo" : "inativo";
return "$nome ($idade anos) — $perfil — $status";
}
echo criarUsuario("Ana", 25);
// Ana (25 anos) — visitante — ativo
echo criarUsuario("Bob", 30, "admin");
// Bob (30 anos) — admin — ativo
echo criarUsuario("Eva", 22, "editor", false);
// Eva (22 anos) — editor — inativo
Passagem por referência
Por padrão, PHP passa variáveis por valor (cópia). Com & você passa a variável original:
php
<?php
function incrementar(int &$numero): void {
$numero++; // modifica o original
}
$x = 10;
incrementar($x);
echo $x; // 11 — a variável original foi alterada
// Sem &
function incrementarCopia(int $numero): void {
$numero++; // modifica só a cópia local
}
$y = 10;
incrementarCopia($y);
echo $y; // 10 — o original não mudou
Escopo de variáveis
PHP tem escopo rígido: variáveis fora de funções não entram automaticamente:
php
<?php
$mensagem = "Olá do escopo global";
function testarEscopo(): void {
// $mensagem não existe aqui!
echo $mensagem ?? "variável não encontrada";
// variável não encontrada
}
testarEscopo();
// Para acessar variável global dentro de função, use global
function comGlobal(): void {
global $mensagem;
echo $mensagem; // Olá do escopo global
}
comGlobal();
// Variáveis estáticas: mantêm valor entre chamadas
function contar(): void {
static $total = 0; // inicializa apenas na primeira chamada
$total++;
echo "Chamada número: $total\n";
}
contar(); // Chamada número: 1
contar(); // Chamada número: 2
contar(); // Chamada número: 3
Funções anônimas (closures)
Funções sem nome que podem ser armazenadas em variáveis:
php
<?php
// Closure básica
$saudar = function(string $nome): string {
return "Olá, $nome!";
};
echo $saudar("Pedro"); // Olá, Pedro!
// Closures com use: capturam variáveis do escopo externo
$prefixo = "Dr.";
$saudarDoutor = function(string $nome) use ($prefixo): string {
return "Olá, $prefixo $nome!";
};
echo $saudarDoutor("Silva"); // Olá, Dr. Silva!
// Muito usadas como callbacks
$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
usort($numeros, function($a, $b) {
return $a - $b;
});
print_r($numeros); // [1, 1, 2, 3, 4, 5, 6, 9]
Arrow functions — fn => (PHP 7.4+)
Versão compacta de closures para expressões simples. Capturam o escopo externo automaticamente (sem use):
php
<?php
// Closure tradicional
$dobrar = function(int $n): int { return $n * 2; };
// Arrow function equivalente — muito mais concisa
$dobrar = fn(int $n): int => $n * 2;
echo $dobrar(5); // 10
// Captura automática do escopo externo
$fator = 3;
$multiplicar = fn($n) => $n * $fator; // $fator capturado automaticamente
echo $multiplicar(7); // 21
// Perfeitas com array_map, array_filter, usort
$precos = [10.0, 25.5, 5.0, 99.9, 15.0];
$caros = array_filter($precos, fn($p) => $p > 20);
$dobrados = array_map(fn($p) => $p * 2, $precos);
print_r($caros); // [25.5, 99.9]
print_r($dobrados); // [20.0, 51.0, 10.0, 199.8, 30.0]
Funções nativas essenciais
PHP tem centenas de funções prontas. As mais usadas:
php
<?php
// Strings
echo strlen("Olá, mundo"); // 10
echo strtoupper("olá"); // OLÁ
echo strtolower("OLÁ"); // olá
echo str_replace("mundo", "PHP", "Olá, mundo!"); // Olá, PHP!
echo str_pad("5", 3, "0", STR_PAD_LEFT); // 005
echo trim(" espaços "); // "espaços"
echo substr("abcdef", 2, 3); // cde
echo strpos("Olá, mundo", "mundo"); // 5
// Números
echo abs(-42); // 42
echo ceil(4.1); // 5 (arredonda para cima)
echo floor(4.9); // 4 (arredonda para baixo)
echo round(4.567, 2); // 4.57
echo max(3, 7, 1, 9); // 9
echo min(3, 7, 1, 9); // 1
echo rand(1, 100); // número aleatório entre 1 e 100
echo number_format(1234567.891, 2, ',', '.'); // 1.234.567,89
// Arrays
$arr = [3, 1, 4, 1, 5];
echo count($arr); // 5
sort($arr);
echo implode(", ", $arr); // 1, 1, 3, 4, 5
echo in_array(4, $arr) ? "tem 4" : "não tem 4"; // tem 4
Exemplo prático completo — sistema de notas
php
<?php
function calcularMedia(array $notas): float {
if (empty($notas)) return 0.0;
return array_sum($notas) / count($notas);
}
function classificarAluno(float $media): string {
return match(true) {
$media >= 9.0 => "Excelente",
$media >= 7.0 => "Aprovado",
$media >= 5.0 => "Recuperação",
default => "Reprovado",
};
}
function gerarRelatorio(array $turma): void {
echo str_pad("RELATÓRIO DA TURMA", 40, "=", STR_PAD_BOTH) . "\n\n";
foreach ($turma as $aluno) {
$media = calcularMedia($aluno['notas']);
$status = classificarAluno($media);
$media = number_format($media, 1, ',', '.');
echo str_pad($aluno['nome'], 15);
echo "Média: $media ";
echo "→ $status\n";
}
}
// Dados
$turma = [
["nome" => "Ana Lima", "notas" => [9.5, 8.0, 10.0, 9.0]],
["nome" => "Bruno Costa", "notas" => [6.0, 7.5, 6.5, 8.0]],
["nome" => "Carla Dias", "notas" => [4.0, 5.0, 4.5, 6.0]],
["nome" => "Diego Melo", "notas" => [3.0, 2.5, 4.0, 3.5]],
];
gerarRelatorio($turma);
Saída:
==========RELATÓRIO DA TURMA==========
Ana Lima Média: 9,1 → Excelente
Bruno Costa Média: 7,0 → Aprovado
Carla Dias Média: 4,9 → Recuperação
Diego Melo Média: 3,3 → Reprovado
Resumo do capítulo
| Conceito | Detalhe |
|---|---|
if/elseif/else | Decisões com condições encadeadas |
switch | Compara uma variável contra múltiplos valores (usa ==) |
match | Versão moderna e estrita do switch, retorna valor (PHP 8+) |
while | Repete enquanto condição for true (verifica antes) |
do...while | Executa ao menos uma vez (verifica depois) |
for | Ideal quando o número de iterações é conhecido |
foreach | Feito para percorrer arrays (indexados e associativos) |
break/continue | Controlam o fluxo dentro de laços |
| Funções | Agrupam código reutilizável com parâmetros e retorno |
| Escopo | Variáveis globais não entram em funções sem global |
| Closures | Funções anônimas armazenadas em variáveis |
| Arrow functions | fn() => — sintaxe compacta, captura escopo automaticamente |