Funciones de retrollamada / Tipos Callable

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 objects, incluyendo métodos estáticos de clase.

Paso de una función de retrollamada

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 object instanciado es pasado como un array que contiene un object 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 object de esa clase, ya sea pasando el nombre de la clase en lugar de un object 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 resultado del ejemplo sería:

2 4 6 8 10

Nota:

Las funciones de retorno de llamada que se registran con funciones como call_user_func() y call_user_func_array() no se llamarán si se produce una excepción en la función de retorno previa.