Callbacks podem ser representadas pela declaração de tipo callable.
Algumas funções como call_user_func() ou usort() aceitam funções de callback definidas pelo usuário como parâmetro. Funções de callback 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 arrow functions 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 callable de primeira classe.
Geralmente, qualquer objeto implementando __invoke() também pode ser passado para um parâmetro callback.
Exemplo #1 Exemplos de funções de callback
<?php
// Exemplo de função de callback
function minha_funcao_callback() {
echo 'olá mundo!';
}
// Exemplo de método de callback
class MinhaClasse {
static function meuMetodoCallback() {
echo 'Olá Mundo!';
}
}
// Tipo 1: Calback simples
call_user_func('minha_funcao_callback');
// Tipo 2: Chamada a métodos estáticos
call_user_func(array('MinhaClasse', 'meuMetodoCallback'));
// Tipo 3: Chamada a métodos de objetos
$obj = new MinhaClasse();
call_user_func(array($obj, 'meuMetodoCallback'));
// Tipo 4: Chamada a métodos estáticos
call_user_func('MinhaClasse::meuMetodoCallback');
// Tipo 5: Chamada relativa a métodos estáticos
class A {
public static function quem() {
echo "A\n";
}
}
class B extends A {
public static function quem() {
echo "B\n";
}
}
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 callables
class C {
public function __invoke($nome) {
echo 'Olá ', $nome, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Exemplo #2 Exemplo de Callback 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.