Funções — Noções básicas

As funções são os blocos básicos da programação. Ao agrupar código reutilizável em funções, você passa do nível de “escrever scripts” para o de “construir com blocos” — cada função se torna uma peça reutilizável.

1. Definição e chamada de funções

PHP
<?php
// Define a function
function greet() {
    echo "Hello, World!";
}

// Call the function
greet();  // Output: Hello, World!
greet();  // You can call it repeatedly
?>

Os nomes das funções não diferenciam maiúsculas de minúsculas (mas a convenção é usar letras minúsculas com sublinhados — snake_case):

PHP
GREET();  // This also works, but don't do it

2. Parâmetros e valores de retorno

As funções podem receber parâmetros (entrada) e retornar dados (saída):

PHP
<?php
// A function with a parameter
function greet($name) {
    return "Hello, {$name}!";
}

$msg = greet("John");
echo $msg;  // Hello, John!
?>

(1) Vários parâmetros

PHP
<?php
function calculateTotal($price, $quantity, $tax = 1.0) {
    return $price * $quantity * $tax;
}

echo calculateTotal(10, 3);        // 30 (tax uses the default of 1.0)
echo calculateTotal(10, 3, 1.13);  // 33.9 (custom tax passed in)
?>
💡 Dica: Os parâmetros com valores padrão devem vir depois dos parâmetros sem valores padrão. function f($a = 1, $b) causará um erro.


3. Declarações de tipos (PHP 7+)

O PHP 7+ oferece suporte a declarações de tipo para parâmetros de função e valores de retorno, tornando seu código mais seguro:

PHP
<?php
// Parameter type declarations + return type declaration
function add(int $a, int $b): int {
    return $a + $b;
}

echo add(3, 5);      // 8
echo add("3", "5");  // 8 (PHP auto-converts)
// echo add("hello", 5); // TypeError!

// Other type declarations
function displayUser(string $name, int $age): void {
    echo "{$name}, {$age} years old";
}

function getPrice(float $price): string {
    return "$" . number_format($price, 2);
}
?>
Tipo Declaração Observações
Inteiro int Converte automaticamente para int
Float float Converte automaticamente para float
String string Converte automaticamente para string
Booleano bool Converte automaticamente para booleano
Matriz array Deve ser uma matriz
Sem devolução void Não é possível devolver nada
Nulo ?string Aceita string ou nulo
Tipo de união (PHP 8+) int|float Aceita int ou float
Misto mixed Qualquer tipo
💡 Dica: Ao escrever um novo código, sempre inclua declarações de tipo. Elas tornam a intenção do seu código mais clara e permitem detectar erros antecipadamente — se o chamador passar um tipo incorreto, você receberá um TypeError em vez de gerar resultados estranhos sem aviso prévio.

▶ Exemplo: Função prática com declarações de tipo

PHP
<?php
// Combined type declarations: union type + void + default value
function formatPrice(int|float $price, string $currency = "$"): string {
    return $currency . number_format((float)$price, 2);
}

function logAction(string $user, string $action): void {
    echo "[" . date("H:i:s") . "] {$user} performed {$action}<br>";
}

echo formatPrice(39.9);         // $39.90
echo formatPrice(100);           // $100.00
logAction("admin", "logged in"); // [14:30:45] admin performed logged in
?>
▶ Experimente

4. Tipagem estrita (strict_types)

Por padrão, as declarações de tipo do PHP permitem a coerção automática de tipos ("3" pode ser passado para um parâmetro int). Ao ativar o modo estrito, os tipos devem corresponder exatamente:

▶ Exemplo: Modo Padrão x Modo Estrito

PHP
<?php
// Default mode: automatic type coercion
function double(int $n): int {
    return $n * 2;
}
echo double("5");  // 10 ("5" is auto-converted to int 5)

// Strict mode: by the book
declare(strict_types=1);

function doubleStrict(int $n): int {
    return $n * 2;
}
echo doubleStrict("5");  // TypeError! Must pass an int
echo doubleStrict(5);    // 10 ✅

function greetStrict(string $name): string {
    return "Hello, {$name}";
}
// echo greetStrict(123);  // TypeError! A number is not a string
echo greetStrict("John");  // ✅
?>
▶ Experimente
💡 Dica: declare(strict_types=1) deve ser a primeira instrução em um arquivo PHP (imediatamente após a tag <?php). Isso afeta apenas as chamadas de função dentro do arquivo atual, e não o arquivo onde a função está definida. Para novos projetos, habilite o modo estrito por padrão.


5. A instrução return

PHP
<?php
function getUser($id) {
    // Query the database... let's pretend we found a user
    if ($id <= 0) {
        return null;  // Invalid ID — bail out early
    }
    return [
        "id" => $id,
        "name" => "User{$id}"
    ];
}

$user = getUser(1);
if ($user !== null) {
    echo $user["name"];  // User1
}

// void function: returns nothing
function logError(string $message): void {
    // Write to the error log
    error_log($message);
    // Do not write return $something;
}
?>

Após return, a função é encerrada imediatamente. Isso é especialmente útil para cláusulas de guarda — para tratar casos excepcionais em primeiro lugar e retornar antecipadamente.


6. Comentários PHPDoc

Boas funções precisam de documentação. O PHPDoc é o padrão de comentários do PHP:

PHP
<?php
/**
 * Calculate the total price
 *
 * @param float $price    Unit price
 * @param int   $quantity Quantity purchased
 * @param float $tax      Tax rate (default 1.0 for tax-inclusive)
 * @return float Final total price
 *
 * Examples:
 *   calculateTotal(10, 3)       → 30.0
 *   calculateTotal(10, 3, 1.13) → 33.9
 */
function calculateTotal(float $price, int $quantity, float $tax = 1.0): float {
    return $price * $quantity * $tax;
}
?>
Tag Finalidade
@param Descrição do parâmetro (tipo + nome + explicação)
@return Descrição do valor de retorno
@throws Exceções que podem ser lançadas
@var Tipo de variável
@see Referência relacionada
💡 Dica: O PHPDoc não serve apenas para pessoas — a extensão Intelephense do VS Code o lê para oferecer autocompletar e sugestões de tipos. Um PHPDoc bem escrito transforma seu IDE em um assistente inteligente.


7. Convenções de nomenclatura de funções

Os nomes das funções PHP seguem o padrão comunitário snake_case:

PHP
// ✅ Good function names
function get_user_by_id($id) {}
function calculate_total_price($items) {}
function send_verification_email($email) {}

// ❌ Inconsistent naming
function GetUserById($id) {}    // Don't use PascalCase
function getUserById($id) {}    // Don't use camelCase (methods use this, not functions)
function getuserbyid($id) {}    // Don't use all-lowercase-no-separators
💡 Dica: Verbo + substantivo: get_ (buscar), set_ (atribuir), calculate_ (calcular), create_ (fazer), delete_ (remover), validate_ (verificar), format_ (apresentar).

❓ Perguntas Frequentes

P: Quando devo usar o tipo de retorno void? R: Quando uma função realiza uma ação sem retornar dados — por exemplo, exibir uma página, gravar em um log, enviar um e-mail ou modificar o estado global. void indica aos chamadores: “Esta função faz algo — não espere um valor de retorno.”

P: Qual é a diferença entre declarações de tipo e conversão de tipo? R: As declarações de tipo na assinatura da função indicam “Espero esse tipo”. O PHP realiza automaticamente a conversão de tipos no momento da chamada. Ative strict_types para desativar a conversão automática — passar o tipo errado causará então um erro, o que é mais seguro.

P: Posso escrever código depois de return? R: Você pode, mas ele não será executado. return encerra a função imediatamente. Normalmente, seu IDE exibirá um aviso sobre “código inacessível”.

📖 Resumo

📝 Exercícios

  1. Escreva uma função calculateBMI($weight, $height) que receba como parâmetros o peso (kg) e a altura (m), retorne o IMC (peso ÷ altura²) e acrescente uma avaliação como “Abaixo do peso / Normal / Acima do peso / Obeso”.
  2. Ative o modo estrito e crie uma função formatCurrency(float $amount, string $symbol = "$"): string que formate um valor monetário. Use o modo estrito para garantir que o valor seja sempre um float.
  3. Escreva uma função getPageUrl(string $base, int $page): string que crie uma URL de paginação. Se a página for 1, retorne apenas a base; caso contrário, acrescente ?page=N. Escreva comentários PHPDoc para ela.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%