<h2>Declaração de Funções em PHP</h2>
<p>Uma função em PHP é um bloco de código reutilizável que executa uma tarefa específica. Ela reduz duplicação, melhora legibilidade e facilita manutenção. A declaração básica usa a palavra-chave <code>function</code>, seguida pelo nome e parênteses.</p>
<pre><code class="language-php">function saudar() {
echo "Olá, mundo!";
}
saudar(); // Saída: Olá, mundo!</code></pre>
<p>Nomes de funções devem ser descritivos, começar com letra ou underscore, e seguir a convenção camelCase ou snake_case. PHP não diferencia maiúsculas de minúsculas em nomes de funções, mas é boa prática manter consistência. Funções podem ser declaradas em qualquer lugar do script e chamadas após sua definição ou até mesmo antes (PHP faz parsing completo primeiro).</p>
<h2>Parâmetros e Argumentos</h2>
<h3>Parâmetros Obrigatórios e Opcionais</h3>
<p>Parâmetros são variáveis recebidas pela função. Você pode definir valores padrão, tornando-os opcionais. Argumentos são os valores passados na chamada da função.</p>
<pre><code class="language-php">function calcularDesconto($preco, $percentual = 10) {
$desconto = $preco * ($percentual / 100);
return $preco - $desconto;
}
echo calcularDesconto(100); // Usa percentual padrão: 90
echo calcularDesconto(100, 20); // Usa percentual 20: 80</code></pre>
<p>Parâmetros com valores padrão devem estar sempre após parâmetros obrigatórios. Se você tentar inverter essa ordem, PHP lançará um erro fatal.</p>
<h3>Type Hints e Validação</h3>
<p>Type hints garantem que apenas tipos específicos sejam aceitos, aumentando a segurança do código. A partir do PHP 7, é possível declarar tipos explicitamente.</p>
<pre><code class="language-php">function somar(int $a, int $b): int {
return $a + $b;
}
echo somar(5, 3); // 8
echo somar(5.7, 3.2); // 8 (valores float são convertidos)
// somar("5", "3"); // Funciona: strings numéricas são convertidas</code></pre>
<p>O modo strict (declare(strict_types=1)) força type coercion rigorosa no início do arquivo. Você também pode usar type hints para objetos, arrays e interfaces, criando código mais robusto e autodocumentado.</p>
<h3>Parâmetros por Referência</h3>
<p>Por padrão, PHP passa parâmetros por valor (cópia). Com referência (&), a função modifica a variável original.</p>
<pre><code class="language-php">function incrementar(&$numero) {
$numero++;
}
$x = 5;
incrementar($x);
echo $x; // 6 — a variável original foi modificada</code></pre>
<p>Use referências com cautela, pois podem dificultar o rastreamento de mudanças. Preferencialmente, retorne o novo valor em vez de usar referências.</p>
<h2>Retorno de Valores</h2>
<h3>Return e Tipos de Retorno</h3>
<p>A instrução <code>return</code> encerra a função e devolve um valor ao chamador. Funções sem <code>return</code> explícito retornam <code>null</code>.</p>
<pre><code class="language-php">function obterIdade($anoNascimento) {
$anoAtual = date('Y');
return $anoAtual - $anoNascimento;
}
$idade = obterIdade(1990);
echo $idade; // Número correspondente ao ano atual menos 1990</code></pre>
<p>Type hints para retorno melhoram clareza. Combine com parâmetros tipados para máxima robustez:</p>
<pre><code class="language-php">function processar(string $nome, int $idade): string {
if ($idade < 18) {
return "Menor de idade";
}
return "Bem-vindo, $nome!";
}
echo processar("Ana", 25); // Bem-vindo, Ana!</code></pre>
<h3>Retornando Múltiplos Valores</h3>
<p>Quando precisa retornar múltiplos valores, use arrays ou objetos. A desestruturação de arrays (PHP 7.1+) torna isso elegante.</p>
<pre><code class="language-php">function dividirnome($nomeCompleto) {
$partes = explode(" ", $nomeCompleto);
return [
'primeiro' => $partes[0] ?? '',
'ultimo' => end($partes) ?? ''
];
}
['primeiro' => $f, 'ultimo' => $u] = dividirnome("João Silva");
echo "$f - $u"; // João - Silva</code></pre>
<p>Alternativamente, retorne um objeto para melhor legibilidade em estruturas complexas:</p>
<pre><code class="language-php">function validarEmail($email): object {
$valido = filter_var($email, FILTER_VALIDATE_EMAIL);
return (object)[
'valido' => (bool)$valido,
'mensagem' => $valido ? 'Email válido' : 'Email inválido'
];
}
$resultado = validarEmail("usuario@exemplo.com");
echo $resultado->mensagem; // Email válido</code></pre>
<h2>Funções Avançadas</h2>
<h3>Argumentos Variáveis</h3>
<p>Use <code>...</code> (splat operator) para aceitar número indefinido de argumentos:</p>
<pre><code class="language-php">function somar(...$numeros) {
return array_sum($numeros);
}
echo somar(1, 2, 3, 4, 5); // 15
echo somar(10, 20); // 30</code></pre>
<h3>Funções Anônimas e Arrow Functions</h3>
<p>Funções anônimas são úteis em callbacks. Arrow functions (PHP 7.4+) oferecem sintaxe mais concisa:</p>
<pre><code class="language-php">$nomes = ['Ana', 'Bruno', 'Carlos'];
// Anônima
$maiusculas = array_map(function($nome) {
return strtoupper($nome);
}, $nomes);
// Arrow function
$maiusculas = array_map(fn($nome) => strtoupper($nome), $nomes);
print_r($maiusculas); // [ANA, BRUNO, CARLOS]</code></pre>
<p>Arrow functions capturam automaticamente variáveis do escopo pai, enquanto funções anônimas exigem <code>use()</code>.</p>
<h2>Conclusão</h2>
<p>Dominar funções em PHP é essencial para escrever código limpo e manutenível. Retenha: <strong>(1)</strong> declare funções com nomes descritivos e use type hints para clareza; <strong>(2)</strong> parametrize adequadamente, aproveitando valores padrão e referências quando apropriado; <strong>(3)</strong> retorne valores explicitamente e considere devolver arrays ou objetos para dados complexos. Com esses fundamentos, você construirá aplicações profissionais e escaláveis.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://www.php.net/manual/en/language.functions.php" target="_blank" rel="noopener noreferrer">PHP Manual: Functions</a></li>
<li><a href="https://www.php.net/manual/en/language.types.declarations.php" target="_blank" rel="noopener noreferrer">PHP Manual: Type Declarations</a></li>
<li><a href="https://www.php.net/manual/en/functions.arrow.php" target="_blank" rel="noopener noreferrer">Documentação Arrow Functions</a></li>
<li><a href="https://www.php-fig.org/psr/psr-12/" target="_blank" rel="noopener noreferrer">PHP Best Practices - PSR-12</a></li>
<li><a href="https://www.oreilly.com/library/view/clean-code-in/9781098129195/" target="_blank" rel="noopener noreferrer">Clean Code in PHP - O'Reilly</a></li>
</ul>