Bienvennidos sean a este post, hoy veremos una funcion de PHP.
Esta funcion nos devuelve el resultado de un llamado a una funcion de callback, veamos su sintaxis:
call_user_func(callback[, argumentos]);
El primer parametro sera la funcion de callback que llamaremos para obtener el resultado devuelto por la misma, como opcional podemos pasar los argumentos que necesitemos para la funcion que llamamos anteriormente. Para entender el concepto vamos a analizar el siguiente ejemplo:
<?php
function sumar($a, $b)
{
return $a + $b;
}
echo call_user_func("sumar", 10, 20) . "\n";
?>
Primero definimos una funcion llamada sumar que recibira dos valores y devolvera la suma de ambos. En el codigo mostraremos el resultado de usar a call_user_func. Para ello primero le pasamos la funcion anterior, luego los dos valores para los argumentos de la funcion. Ejecutemos para ver como es su salida:
$ php call.php
30
$
Como pueden ver realizo la operacion de la funcion. Tomemos el codigo y realicemos la siguiente modificcacion:
<?php
function incrementar(&$var)
{
++$var;
}
$a = 0;
call_user_func("incrementar", $a);
echo $a . "\n";
?>
En este caso, tenemos un argumento de tipo referencia e incrementamos el valor recibido. Por fuera, definimos una variable y la pasaremos como argumento a call_user_func y como callback a la nueva funcion. Para finalmente, mostrar el valor de $a. Compilemos y veamos como es la salida:
$ php call.php
PHP Warning: incrementar(): Argument #1 ($var) must be passed by reference, value given in /home/tinchicus/lenguajes/php/c/call.php on line 9
0
$
No nos dio un error pero si un aviso. En este caso, nos informa que el valor informado debe ser pasado como referencia. Por lo tanto, no recibio ningun valor y no pudo procesarlo y eso lo comprobamos con el valor de $a. Este es un problema de esta funcion, para comprobarlo debemos tomar el codigo anterior y buscar la siguiente linea:
call_user_func("incrementar", $a);
Y modificarla de la siguiente manera:
incrementar($a);
Aqui haremos un llamado directo a la funcion y le pasamos el mismo parametro, observen que no agregamos nada mas, y si lo compilan y ejecutan tendran la siguiente salida:
$ php call.php
1
$
Como pueden ver funciono perfectamente, realizando la tarea pensada originalmente. Volvamos al codigo anterior y hagamos las siguientes modificaciones:
<?php
function saludar($nombre)
{
echo "Hola, $nombre! Como estas?\n";
}
call_user_func("saludar","tinchicus");
?>
Ahora tenemos una funcion para saludar. La cual recibira el nombre para realizar el saludo, y esta accion la mostraremos mediante un mensaje con echo. Por fuera, haremos un llamado a call_user_func y le pasaremos nuevamente la funcion y el dato. Si lo ejecutan obtendran esta salida:
$ php call.php
Hola, tinchicus! Como estas?
$
Ya vimos como podemos devolver un valor, como mostrar un texto asi como tambien no podemos trabajar con valores de tipo referencia. Pero esto no se acaba porque tambien podemos trabajar de la siguiente manera:
<?php
class miClase
{
static function saludar($nombre)
{
echo "Hola, $nombre!! Como estas?\n";
}
};
$clase = "miClase";
$objeto = new miClase();
call_user_func(array($clase,"saludar"),"tinchicus");
call_user_func($clase . "::saludar","Martin");
call_user_func(array($objeto, "saludar"),"Miranda");
?>
En esta ocasion, primero definimos una clase que contendra una version estatica de la funcion saludar que teniamos anteriormente. Es exactamente lo mismo pero ahora esta en la clase. Por fuera, definimos una variable que posee el nombre de la clase y luego definimos un objeto de la clase, ya veremos para que. Para la primer llamada usaremos a array para pasar un array de dos valores. El primero sera la variable con el nombre de la clase y el nombre del metodo a ejecutar. Por fuera pasaremos el parametro que debemos pasar al metodo. La siguente linea efectua otro llamado donde usamos nuevamente a la variable donde lo concatenamos con el operador de resolucion de nombres seguido del nombre del metodo. Y nuevamente pasamos el parametro que necesita el metodo para mostrarlo. Por ultimo, hacemos un tercer llamado donde usaremos un array nuevamente pero ahora pasaremos el objeto de nuestra clase y el nombre del metodo. Pasamos el argumento seguido al array tal como hicimos la primera vez pero en lugar de usar la clase pasamos un objeto. Si lo ejecutamos debemos obtener una salida como la siguiente:
$ php call.php
Hola, tinchicus!! Como estas?
Hola, Martin!! Como estas?
Hola, Miranda!! Como estas?
$
En resumen, hoy hemos visto a call_user_func, que es, para que sirve, como se utiliza, y algunos ejemplos para poder verlo en accion. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donatión
It’s for site maintenance, thanks!
$1.50
