Callbacks podem ser representadas pela declaração de tipo callable a partir do PHP 5.4. Esta documentação utiliza o tipo callback para referenciar a mesma coisa.
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 objetos, 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 objeto instanciado é passado como um array contendo um objeto 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 objeto dessa classe ao passar o nome da classe ao invés de um objeto no índice 0. A partir do PHP 5.2.3, também é possível utilizar 'NomeDaClasse::nomeDoMetodo'.
Além de funções comuns definidas pelo usuário, funções anônimas também podem ser passadas como um parâmetro de callback.
Exemplo #1 Exemplos de funções de callback
<?php
// Exemplo de função de callback
function my_callback_function() {
echo 'hello world!';
}
// Exemplo de método de callback
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Tipo 1: Calback simples
call_user_func('my_callback_function');
// Tipo 2: Chamada à métodos estáticos
call_user_func(array('MyClass', 'myCallbackMethod'));
// Tipo 3: Chamada à metodos de objetos
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Tipo 4: Chamada à métodos estáticos (a partir do PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
// Tipo 5: Chamada relativa à métodos estáticos (a partir do PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
// Type 6: Objetos que implementam __invoke podem sere utilizados como callables (desde o PHP 5.3)
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\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;
};
// Este é 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 irá imprimir:
2 4 6 8 10
Nota: No PHP 4, era necessário o uso de referência para criar um callback que realmente aponta para o objeto, e não para uma cópia dele. Para maiores detalhes, veja Explicação sobre referências.
Nota:
Callbacks registrados com funções como call_user_func() e call_user_func_array() não serão chamados caso haja uma exceção não-pega lançada em um callback anterior.