Uma função PHP é definida com a palavra-chave function, um nome, uma lista de parâmetros e um corpo; return devolve um valor a quem chamou. function add(int $a, int $b): int { return $a + $b; } a define, e add(2, 3) a chama e retorna 5.
Os string e int antes dos parâmetros são declarações de tipo, e : string depois dos parênteses é o tipo de retorno. Os dois são opcionais, mas pegam erros cedo e documentam o que a função espera.
Valores de retorno e retornar vários valores
return encerra a função na hora. Uma função sem return, ou com um return; sozinho, retorna null; declare : void quando ela é chamada só pelo efeito. Uma função retorna um valor, mas esse valor pode ser um array, que você desestrutura do lado de quem chama:
Veja desestruturação de arrays para as outras formas de [...] =.
Parâmetros padrão e argumentos nomeados
Um parâmetro com = value é opcional: quem chama pode omiti-lo. Parâmetros opcionais vêm depois dos obrigatórios. Desde o PHP 8.0, argumentos nomeados deixam quem chama passar qualquer parâmetro pelo nome, então você pode pular os opcionais de que não precisa.
Argumentos nomeados também deixam legíveis as chamadas a funções nativas: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). O nome do parâmetro passa a fazer parte da interface pública da função, então renomear um parâmetro pode quebrar quem usa os nomes.
Passagem por referência
Normalmente o PHP passa uma cópia de cada argumento, então a função não pode alterar a variável de quem chamou. Um & antes de um parâmetro passa a própria variável. Funções nativas como sort() funcionam assim.
Retornar um novo valor costuma ser mais claro que alterar um argumento. Use referências quando a função realmente deve modificar algo no lugar.
Declarações de tipo e strict_types
Por padrão, o PHP converte os argumentos para o tipo declarado quando consegue: add("5", 3) transforma "5" em 5. Colocar declare(strict_types=1); bem no topo do arquivo desliga isso para as chamadas feitas naquele arquivo, então um tipo errado lança um TypeError em vez de ser convertido.
Sem a linha do declare, a mesma chamada imprime 8. Strings que não são números, como "five", lançam um TypeError nos dois modos.
Os tipos que você pode declarar para parâmetros e valores de retorno:
never é um tipo de retorno para funções que sempre lançam exceção ou encerram o script. Nomes de classes e interfaces também funcionam como tipos.
Número variável de argumentos com ...$args
...$numbers reúne qualquer quantidade de argumentos num array. O mesmo ... do lado de quem chama espalha um array em argumentos separados.
Usar uma variável de fora dentro de uma função
Uma função tem o próprio escopo. Uma variável definida fora dela não é visível dentro, o que surpreende quem vem do JavaScript:
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
e a função retorna o preço sem imposto. Passe o valor como parâmetro. Isso deixa a função honesta sobre aquilo de que depende e fácil de testar:
A palavra-chave global também funciona, mas esconde a dependência; o escopo de variáveis a explica. Para funções curtas passadas a outras funções, como callbacks para o array_map(), veja funções anônimas, que podem capturar variáveis de fora com use.
Perguntas frequentes
Como defino uma função no PHP?
Use a palavra-chave function, um nome, parâmetros entre parênteses e um corpo: function add(int $a, int $b): int { return $a + $b; }. Chame como add(2, 3). Nomes de funções não diferenciam maiúsculas de minúsculas, e uma função definida no nível superior de um arquivo pode ser chamada antes da linha que a define.
Como retorno vários valores de uma função PHP?
Retorne um array e desestruture: function minMax(array $a): array { return [min($a), max($a)]; } e depois [$min, $max] = minMax([3, 1, 4]);. Para resultados com nome, retorne um array associativo e use ['min' => $min] = ....
O que faz declare(strict_types=1)?
Ele desliga a conversão automática de tipos nas chamadas feitas naquele arquivo, então passar "5" para um parâmetro int lança um TypeError em vez de convertê-lo em 5. Precisa ser a primeira instrução do arquivo e só afeta aquele arquivo.
O que são argumentos nomeados no PHP?
Desde o PHP 8.0 você pode passar argumentos pelo nome do parâmetro: htmlspecialchars($s, double_encode: false). Eles podem vir em qualquer ordem depois dos posicionais e permitem pular parâmetros opcionais que você não quer mudar.
Como passo uma variável por referência no PHP?
Coloque & antes do parâmetro: function addOne(int &$n): void { $n++; }. A função então altera a variável de quem chamou. Sem &, o PHP passa uma cópia e a variável de quem chamou continua igual.