Funções em PHP
LidoEsta aula aborda funções em PHP, desde a declaração básica até tópicos avançados como parâmetros, valores padrão, retorno e tipagem. O conteúdo é prático e progressivo, com exemplos de código e exercícios para fixação.
Funções são blocos de código reutilizáveis que executam uma tarefa específica. Em PHP, elas são fundamentais para organizar o código, evitar repetição e facilitar a manutenção. Nesta aula, você aprenderá a declarar funções, trabalhar com parâmetros, valores padrão, retorno e tipagem, tanto de parâmetros quanto de valores retornados.
Dominar funções é essencial para escrever código limpo e eficiente. Vamos explorar cada aspecto com exemplos práticos que você pode testar em seu ambiente de desenvolvimento.
Declaração
Em PHP, uma função é declarada com a palavra-chave function, seguida pelo nome da função, parênteses (que podem conter parâmetros) e um bloco de código entre chaves. O nome da função deve ser único e seguir as regras de nomenclatura do PHP (case-insensitive, mas é boa prática usar snake_case).
Funções podem ser definidas em qualquer lugar do script, mas geralmente são colocadas no topo ou em arquivos separados para melhor organização. Elas só são executadas quando chamadas explicitamente.
<?php
// Declaração simples
function saudacao() {
echo "Olá, mundo!";
}
// Chamada da função
saudacao(); // Imprime: Olá, mundo!
?>Funções podem ser definidas condicionalmente, mas isso é raro e deve ser evitado por clareza. Também é possível usar funções anônimas (closures) e funções arrow (a partir do PHP 7.4), que veremos em aulas futuras.
Parâmetros e valores padrão
Parâmetros são variáveis que a função recebe para processar. Eles são definidos entre os parênteses da declaração. Ao chamar a função, você passa argumentos que serão atribuídos a esses parâmetros.
Parâmetros podem ter valores padrão, que são usados quando nenhum argumento é passado. Isso torna a função mais flexível. Valores padrão devem ser constantes ou expressões simples, não variáveis ou chamadas de função.
<?php
function cumprimentar($nome, $sobrenome = "Silva") {
echo "Olá, $nome $sobrenome!";
}
cumprimentar("João"); // Olá, João Silva!
cumprimentar("Maria", "Santos"); // Olá, Maria Santos!
?>Parâmetros podem ser passados por valor (padrão) ou por referência (usando &). Por valor, a função recebe uma cópia; por referência, a função pode modificar a variável original. Isso é útil para economizar memória ou permitir alterações.
<?php
function incrementar(&$num) {
$num++;
}
$valor = 5;
incrementar($valor);
echo $valor; // 6
?>Desde o PHP 8, é possível usar parâmetros nomeados, que permitem passar argumentos em qualquer ordem, especificando o nome do parâmetro. Isso melhora a legibilidade quando há muitos parâmetros.
<?php
function configurar($host, $porta = 3306, $usuario = "root") {
echo "Host: $host, Porta: $porta, Usuário: $usuario";
}
configurar(usuario: "admin", host: "localhost"); // Host: localhost, Porta: 3306, Usuário: admin
?>Retorno
Funções podem retornar um valor usando a instrução return. O valor retornado pode ser de qualquer tipo (incluindo arrays, objetos, etc.). Quando o PHP encontra return, a execução da função é encerrada imediatamente e o valor é devolvido ao chamador.
Se uma função não tiver return, ela retorna null. É possível retornar múltiplos valores usando um array ou, a partir do PHP 7.1, com a sintaxe de desestruturação.
<?php
function soma($a, $b) {
return $a + $b;
}
$resultado = soma(3, 4);
echo $resultado; // 7
function dados() {
return ["João", 30];
}
list($nome, $idade) = dados();
echo "$nome tem $idade anos";
?>O tipo de retorno pode ser declarado opcionalmente, o que veremos a seguir. Declarar o retorno ajuda a documentar e garantir que a função produza o tipo esperado.
Tipagem de parâmetros e retorno
O PHP é uma linguagem de tipagem dinâmica, mas desde o PHP 5 você pode declarar tipos para parâmetros e, desde o PHP 7, para retorno. Isso é chamado de tipagem escalar e ajuda a evitar erros, tornando o código mais previsível.
Os tipos suportados incluem: int, float, string, bool, array, object, callable, iterable, e classes específicas. Por padrão, o PHP tenta converter valores para o tipo declarado (modo coercivo). Para exigir tipos exatos, use declare(strict_types=1); no início do arquivo.
<?php
declare(strict_types=1);
function somar(int $a, int $b): int {
return $a + $b;
}
echo somar(2, 3); // 5
// echo somar(2.5, 3); // Erro em strict_types
echo somar("2", 3); // Erro em strict_types, pois string não é convertida
?>No modo coercivo (sem strict_types), o PHP converte automaticamente: somar("2", 3) funcionaria, resultando em 5. Tipos podem ser opcionais (nullable) usando ?tipo, o que permite null como valor. Também é possível usar tipos união (PHP 8) como int|string.
<?php
function saudacao(?string $nome): string {
return "Olá, " . ($nome ?? "visitante") . "!";
}
echo saudacao(null); // Olá, visitante!
echo saudacao("Ana"); // Olá, Ana!
function converter(int|string $valor): string {
return (string) $valor;
}
?>Com a tipagem, o IDE pode fornecer autocompletar e detectar erros em tempo de desenvolvimento. É uma boa prática declarar tipos sempre que possível, pois documenta a intenção e previne bugs.
Boas práticas
Ao criar funções, prefira nomes que indiquem claramente o que fazem (verbos no infinitivo). Mantenha funções pequenas e com uma única responsabilidade. Evite efeitos colaterais, como modificar variáveis globais, a menos que necessário. Use parâmetros para entrada e retorno para saída.
Documente suas funções com comentários PHPDoc para descrever parâmetros, retorno e possíveis exceções. Isso ajuda outros desenvolvedores e ferramentas de análise.
/**
* Calcula a média de um array de números.
*
* @param float[] $numeros Lista de números.
* @return float A média.
*/
function media(array $numeros): float {
if (empty($numeros)) {
return 0.0;
}
return array_sum($numeros) / count($numeros);
}
?>Referências
- PHP: Funções - Manual
- PHP: Funções definidas pelo usuário
- PHP: Argumentos de funções
- PHP: Retornando valores
- PHP: Declarações de tipo
- PHP: Sistema de tipos
Exercícios
- Crie uma função chamada
ehParque recebe um número inteiro e retornatruese for par,falsecaso contrário. Teste com valores pares e ímpares.✓ Resposta:<?php function ehPar(int $numero): bool { return $numero % 2 === 0; } var_dump(ehPar(4)); // bool(true) var_dump(ehPar(7)); // bool(false) ?> - Escreva uma função
saudacaoPersonalizadaque aceite um nome e um horário (manhã, tarde, noite) e retorne uma saudação apropriada. Use valores padrão para o horário ("dia"). Teste chamadas com e sem o segundo argumento.✓ Resposta:<?php function saudacaoPersonalizada(string $nome, string $horario = "dia"): string { switch ($horario) { case "manhã": return "Bom dia, $nome!"; case "tarde": return "Boa tarde, $nome!"; case "noite": return "Boa noite, $nome!"; default: return "Olá, $nome!"; } } echo saudacaoPersonalizada("João"); // Olá, João! echo saudacaoPersonalizada("Maria", "manhã"); // Bom dia, Maria! ?> - Crie uma função
calcularque receba dois números e uma operação ("soma", "subtracao", "multiplicacao", "divisao") e retorne o resultado. Use tipagem e trate divisão por zero (retornenull).✓ Resposta:<?php function calcular(float $a, float $b, string $operacao): ?float { switch ($operacao) { case "soma": return $a + $b; case "subtracao": return $a - $b; case "multiplicacao": return $a * $b; case "divisao": if ($b == 0) { return null; } return $a / $b; default: return null; } } var_dump(calcular(10, 2, "divisao")); // float(5) var_dump(calcular(10, 0, "divisao")); // NULL ?> - Implemente uma função
inverterArrayque recebe um array e retorna um novo array com a ordem invertida, sem usararray_reverse. Use um loopfor.✓ Resposta:<?php function inverterArray(array $arr): array { $invertido = []; $tamanho = count($arr); for ($i = $tamanho - 1; $i >= 0; $i--) { $invertido[] = $arr[$i]; } return $invertido; } print_r(inverterArray([1, 2, 3, 4])); // Array ( [0] => 4 [1] => 3 [2] => 2 [3] => 1 ) ?> - Escreva uma função
contarVogaisque recebe uma string e retorna a quantidade de vogais (a, e, i, o, u), ignorando maiúsculas/minúsculas. Dica: usestr_splitein_array.✓ Resposta:<?php function contarVogais(string $texto): int { $vogais = ['a', 'e', 'i', 'o', 'u']; $contador = 0; $letras = str_split(strtolower($texto)); foreach ($letras as $letra) { if (in_array($letra, $vogais)) { $contador++; } } return $contador; } echo contarVogais("Olá Mundo"); // 4 ?>