Llamadas de retorno (Callbacks / Callables)

Las devoluciones de llamada pueden indicarse mediante la declaración de tipo callable.

Algunas funciones como call_user_func() o usort() aceptan como parámetro funciones de llamada de retorno definidas por el usuario. Las funciones de llamadas de retorno no sólo pueden ser funciones simples, sino también métodos de un object, incluyendo métodos de clase estáticos.

Pasar una función de llamada de retorno

Una función de PHP se pasa por su nombre como un string. Se puede utilizar cualquier función nativa o definida por el usuario, exceptuando contrucciones del lenguaje, tales como: array(), echo, empty(), eval(), exit(), isset(), list(), print o unset().

Un método de un object instanciado se pasa como un array que contiene un object en el índice 0 y el nombre del método en el índice 1. Está permitido el acceso a métodos protegidos y privados desde dentro de una clase.

Los métodos de clase estáticos también se pueden pasar 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 'NombreDeClase::nombreDeMetodo'.

A parte de las funciones comunes definidas por el usuario, Funciones anónimas y Funciones flecha también pueden pasarse como parámetro de devolución de llamada.

Nota:

A partir de PHP 8.1.0, las funciones anónimas también pueden crearse usando la sintaxis de callable de primera clase.

Generalmente, cualquier objeto que implemente __invoke() también puede pasarse como parámetro de devolución de llamada.

Ejemplo #1 Ejemplos de funciones de llamadas de retorno

<?php

// Un ejemplo de función de llamada de retorno
function mi_función_de_llamada_de_retorno() {
echo
'¡hola mundo!';
}

// Un ejemplo de método de llamada de retorno
class MiClase {
static function
miMétodoDeLlamadaDeRetorno() {
echo
'¡Hola Mundo!';
}
}

// Tipo 1: Llamada de retorno simple
call_user_func('mi_función_de_llamada_de_retorno');

// Tipo 2: Llamada a un método de clase estático
call_user_func(array('MiClase', 'miMétodoDeLlamadaDeRetorno'));

// Tipo 3: Llamada al método de un objeto
$obj = new MiClase();
call_user_func(array($obj, 'miMétodoDeLlamadaDeRetorno'));

// Tipo 4: Llamada a un método de clase estático
call_user_func('MiClase::miMétodoDeLlamadaDeRetorno');

// Tipo 5: Llamada a un método de clase estático relativo
class A {
public static function
quién() {
echo
"A\n";
}
}

class
B extends A {
public static function
quién() {
echo
"B\n";
}
}

call_user_func(array('B', 'parent::quién')); // A, obsoleto a partir de PHP 8.2.0

// Tipe 6: Los objetos que implementan __invoke se pueden emplear como retrollamadas
class C {
public function
__invoke($nombre) {
echo
'Hola ', $nombre, "\n";
}
}

$c = new C();
call_user_func($c, 'PHP!');
?>

Ejemplo #2 Ejemplo de retrollamada utilizando un cierre

<?php
// Nuestro cierre
$doble = function($a) {
return
$a * 2;
};

// Este es nuestro rango de números
$números = range(1, 5);

// Usar el cierre como llamada de retorno para
// doblar el valor de cada elemento de nuestro
// rango
$números_nuevos = array_map($doble, $números);

print
implode(' ', $números_nuevos);
?>

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.