Funções de Retorno / Chamáveis

Funções de retorno podem ser representadas pela declaração de tipo callable.

Algumas funções como call_user_func() ou usort() aceitam funções de retorno definidas pelo usuário como parâmetro. Funções de retorno não precisam ser apenas funções simples, mas também métodos de objects, incluindo os estáticos.

Passagem por parâmetro

Uma função PHP é passada através do seu nome como uma string. Qualquer função interna ou definida pelo usuário pode ser utilizada, com exceção dos construtores de linguagem como: array(), echo, empty(), eval(), exit(), isset(), list(), print ou unset().

Um método de um object instanciado é passado como um array contendo um object no índice 0 e o nome do método no índice 1. Acessar métodos protegidos e privados de uma classe é permitido.

Métodos estáticos também podem ser passados sem a instância de um object dessa classe ao passar um nome da classe em vez de um object no índice 0, ou passando 'ClassName::methodName'.

Além de funções comuns definidas pelo usuário, funções anônimas e funções de seta também podem ser passadas como um parâmetro de callback.

Nota:

A partir do PHP 8.1.0, funções anônimas também podem ser criadas usando a sintaxe de chamável de primeira classe.

Geralmente, qualquer objeto implementando __invoke() também pode ser passado para um parâmetro de função de retorno.

Exemplo #1 Exemplos de funções de retorno

<?php

// Exemplo de função de retorno
function minha_funcao_retorno() {
echo
'olá mundo!', PHP_EOL;
}

// Exemplo de método de retorno
class MinhaClasse {
static function
meuMetodoRetorno() {
echo
'Olá Mundo!', PHP_EOL;
}
}

// Tipo 1: Função de Retorno Simples
call_user_func('minha_funcao_retorno');

// Tipo 2: Chamada a métodos estáticos
call_user_func(array('MinhaClasse', 'meuMetodoRetorno'));

// Tipo 3: Chamada a métodos de objetos
$obj = new MinhaClasse();
call_user_func(array($obj, 'meuMetodoRetorno'));

// Tipo 4: Chamada a métodos estáticos
call_user_func('MinhaClasse::meuMetodoRetorno');

// Tipo 5: Chamada relativa a métodos estáticos
class A {
public static function
quem() {
echo
"A\n", PHP_EOL;
}
}

class
B extends A {
public static function
quem() {
echo
"B\n", PHP_EOL;
}
}

call_user_func(array('B', 'parent::quem')); // A, descontinuado a partir do PHP 8.2.0

// Type 6: Objetos que implementam __invoke podem ser utilizados como chamáveis
class C {
public function
__invoke($nome) {
echo
'Olá ', $nome, PHP_EOL;
}
}

$c = new C();
call_user_func($c, 'PHP!');
?>

Exemplo #2 Exemplo de Função de retorno utilizando uma Closure

<?php
// Nossa closure
$double = function($a) {
return
$a * 2;
};

// Esta é a série de números
$numbers = range(1, 5);

// O uso da closure aqui é para
// dobrar o valor de cada elemento de nossa
// série
$new_numbers = array_map($double, $numbers);

print
implode(' ', $new_numbers);
?>

O exemplo acima produzirá:

2 4 6 8 10

Nota:

Callbacks registrados com funções como call_user_func() e call_user_func_array() não serão chamados se houver uma exceção não capturada que foi lançada em um callback anterior.