Llamadas de retorno

Las llamadas de retorno se pueden indicar con el tipo callable a partir de PHP 5.4. Esta documentación utilizó la información del tipo callback con el mismo propósito.

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.

Los métodos de clase estáticos también se pueden pasar sin instanciar un object de dicha clase, pasando el nombre de la clase en lugar de un object en el índice 0. A partir de PHP 5.2.3, también es posible pasar 'NombreDeClase::nombreDeMetodo'.

A parte de las funciones comunes definidas por el usuario, las funciones anónimas también se pueden pasar a un parámetro de llamada de retorno.

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 (A partir de PHP 5.2.3)
call_user_func('MiClase::miMétodoDeLlamadaDeRetorno');

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

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

call_user_func(array('B''parent::quién')); // A
?>

Ejemplo #2 Ejemplo de llamada de retorno utilizando una clausura

<?php
// Nuestra clausura
$doble = function($a) {
    return 
$a 2;
};

// Este es nuestro rango de números
$números range(15);

// Usar la clausura 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: En PHP 4 era necesario usar una referencia para crear una llamada de retorno que apuntara al object real, y no a una copia del mismo. Para más detalles, véase la Explicación de las referencias.

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.

add a note add a note

User Contributed Notes 6 notes

up
16
steve at mrclay dot org
1 year ago
Performance note: The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback.
up
10
andrewbessa at gmail dot com
1 year ago
You can also use the $this variable to specify a callback:

<?php
class MyClass {

    public
$property = 'Hello World!';

    public function
MyMethod()
    {
       
call_user_func(array($this, 'myCallbackMethod'));
    }

    public function
MyCallbackMethod()
    {
        echo
$this->property;
    }

}
?>
up
2
raj dot aditya at gmail dot com
14 days ago
i did the same thing mentioned above but the following code not working. Why?
---------------------------------------------------------
class Alfa1 {
    public static function falfa() {
        echo "In Alfa";
    }
}

class Beta1 extends Alfa1 {
    public static function falfa() {
        echo "In Beta";
    }
}

call_user_func(array('Beta1','parent::flafa'));

Tested in two latest version of PHP both gives:

Warning: call_user_func() expects parameter 1 to be a valid callback, class 'Alfa1' does not have a method 'flafa' in Xampp\htdocs\a.php on line 15
up
0
Yzmir Ramirez
7 days ago
> As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'

You can also use 'self::methodName'.  This works in PHP 5.2.12 for me.
up
0
computrius at gmail dot com
6 months ago
When specifying a call back in array notation (ie. array($this, "myfunc") ) the method can be private if called from inside the class, but if you call it from outside you'll get a warning:

<?php

class mc {
   public function
go(array $arr) {
      
array_walk($arr, array($this, "walkIt"));
   }

   private function
walkIt($val) {
       echo
$val . "<br />";
   }

    public function
export() {
        return array(
$this, 'walkIt');
    }
}

$data = array(1,2,3,4);

$m = new mc;
$m->go($data); // valid

array_walk($data, $m->export()); // will generate warning

?>

Output:
1<br />2<br />3<br />4<br />
Warning: array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22
up
-2
metamarkers at gmail dot com
10 months ago
you can pass an object as a callable if its class defines the __invoke() magic method..
To Top