Las funciones de retrollamada pueden ser identificadas a través del tipo callable.
Algunas funciones, como call_user_func() o usort(), aceptan como argumento funciones de retrollamada definidas por el usuario. Las funciones de retrollamada pueden ser funciones simples, pero también métodos de objetos, incluyendo métodos estáticos de clase.
Una función PHP es pasada por su nombre, en forma de string. Cualquier función interna o definida por el usuario puede ser utilizada, excepto las construcciones de lenguaje como : array(), echo, empty(), eval(), exit(), isset(), list(), print, o unset().
Un método de un objeto instanciado es pasado como un array que contiene un objeto en el índice 0, y el nombre del método en el índice 1. Acceder a los métodos protegidos y privados dentro de una clase está permitido.
Los métodos estáticos de clase también pueden ser pasados sin instanciar
un objeto de esa clase, ya sea pasando el nombre de la clase en lugar de un
objeto en el índice 0, o pasando
'NombreDeLaClase::NombreDelMetodo'.
Además de las funciones definidas normalmente por el usuario, las funciones anónimas y las funciones flecha también pueden ser utilizadas como argumento de tipo callback.
Nota:
A partir de PHP 8.1.0, las funciones anónimas también pueden ser creadas utilizando la sintaxis callable de primera clase.
Generalmente, cualquier objeto que implemente __invoke() también puede ser pasado al argumento callback.
Ejemplo #1 Ejemplos de funciones de retrollamada
<?php
// Un ejemplo de función de retrollamada
function my_callback_function() {
echo 'hello world!', PHP_EOL;
}
// Un ejemplo de método de retrollamada
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!', PHP_EOL;
}
}
// Tipo 1 : Función de retrollamada simple
call_user_func('my_callback_function');
// Tipo 2 : Llamada a un método estático de clase
call_user_func(array('MyClass', 'myCallbackMethod'));
// Tipo 3 : Llamada a un método de objeto
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Tipo 4 : Llamada a un método estático de clase
call_user_func('MyClass::myCallbackMethod');
// Tipo 5 : Llamada a un método estático de clase relativo
class A {
public static function who() {
echo "A", PHP_EOL;
}
}
class B extends A {
public static function who() {
echo "B", PHP_EOL;
}
}
call_user_func(array('B', 'parent::who')); // A, obsoleto a partir de PHP 8.2.0
// Tipo 6 : Los objetos que implementan __invoke pueden ser utilizados como callables
class C {
public function __invoke($name) {
echo 'Hello ', $name, PHP_EOL;
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Ejemplo #2 Ejemplo de una función de retrollamada utilizando una Closure
<?php
// Nuestra closure
$double = function($a) {
return $a * 2;
};
// Este es nuestro rango de números
$numbers = range(1, 5);
// Uso de la closure como función de retrollamada.
// Aquí, para duplicar el tamaño de cada elemento de nuestro rango
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>El ejemplo anterior mostrará :
2 4 6 8 10
Nota:
Tenga en cuenta que las funciones de devolución de llamada registradas con funciones como call_user_func() y call_user_func_array() no serán llamadas si una excepción no es interceptada cuando ha sido lanzada en una función de devolución de llamada anterior.