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.
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.