Anuncios

Bienvenidos sean a este post, hoy veremos una funcion de php.

Anuncios

Esta funcion nos devuelve el resultado de un llamado a una funcion de callback, veamos su sintaxis:

call_user_func_array(callback[, argumentos]);

Anuncios

El primer parametro sera la funcion de callback y de manera opcional podemos pasar argumentos que seran para la funcion informada, en caso de necesitarlo. Si lo observan es similar a call_user_func, del cual hablamos en este post, pero los argumentos que podemos pasar son de tipos array. Para entender el concepto, vamos a analizar unos ejemplo. Veamos el primero:

<?php

function incrementar(&$var)
{
        ++$var;
}

$a = 0;
call_user_func_array("incrementar", array(&$a));
echo $a . "\n";

?>
Anuncios
Anuncios

En este post hablamos sobre call_user_func y citamos este ejemplo. En ese caso, no lo pudimos utilizar porque nos solicitaba que lo pasaramos como referencia. Este es muy similar, donde tenemos una funcion que recibe un argumento como referencia y lo incrementamos. Por fuera, definimos una variable con un valor inicial. Luego llamamos a la funcion donde pasamos la funcion y como argumento a la variable anterior pero con dos modificaciones con respecto a la otra funcion. Primero que el argumeento lo rodeamos con la funcion array y el parametro lo pasamos como referencia. Finalmente, mostramos el valor de $a. Compilemos y veamos como es la salida:

$ php call.php
1
$
Anuncios

A diferencia de lo que sucedio con call_user_func, aqui se pudo recibir a la referencia e incrementar al valor en esa direccion de memoria. Por lo tanto, no solamente no dio ningun error sino que tambien realizo la tarea solicitada. Analicemos el siguiente ejemplo:

<?php

function mensaje($arg1, $arg2, $arg3)
{
        echo "$arg1 es $arg2 $arg3\n";
}

class miClase
{
        function mensaje($arg1, $arg2, $arg3)
        {
                echo "$arg1 es $arg2 $arg3\n";
        }
}

$objeto = new miClase();
call_user_func_array("mensaje",array("tinchicus","Martin","Miranda"));
call_user_func_array(array($objeto,"mensaje"), array("gary","Enzo","Tortore"));

?>
Anuncios
Anuncios

Aqui utilizaremos una funcion y una clase para pasarlo a nuestra funcion. La primera sera para mostrar un mensaje en base a tres valores recibidos. La clase tiene un metodo igual a la funcion anterior donde recibira tres argumentos y mostrara un mensaje con estos valores recibidos. Lo siguiente es crear un objeto de la clase y haremos dos llamados a la funcion. En la primera le pasaremos a la funcion que definimos al inicio. Los datos para el argumento en lugar de pasarlos directamente como con call_user_func lo haremos mediante array. En esta funcion pasamos los tres valores que seran recibidos y procesados por la funcion. En el segundo caso, usaremos al objeto creado. Para ello, nuevamente usaremos a array donde primero pasaremos al objeto y seguido por el metodo interno, para los argumentos usamos nuevamente a array y le pasamos los tres valores que necesita recibir. Ejecutemos para ver como es su salida:

$ php call.php
tinchicus es Martin Miranda
gary es Enzo Tortore
$
Anuncios

Como pueden ver no solo se llamo a las funciones correctamente sino que recibieron los datos correspondientes. Vamos a analizar un ejemplo mas con otra posibilidad disponible:

<?php

namespace espacio;

class miClase
{
        static public function mensaje($arg1, $arg2, $arg3)
        {
                echo "$arg1 es $arg2 $arg3\n";
        }
}

call_user_func_array( __NAMESPACE__ . "\miClase::mensaje",
                        array("tinchicus","Martin","Miranda"));
call_user_func_array(array(__NAMESPACE__ . "\miClase", "mensaje"),
                        array("gary","Enzo","Tortore"));

?>
Anuncios
Anuncios

La primera modificacion es la eliminacion de la funcion y dejamos la clase. La segunda es la asignacion de un namespace. La tercera fue el cambio del metodo de la clase a estatico y publico. La ultima modificacion, fue la eliminacion del objeto de la clase. Pasemos ahora a los dos llamados de la funcion. En el primero pasamos el namespace actual mediante esa constante. A esta le concatenamos el metodo de la clase. Como argumentos, al igual que hicimos anteriormente lo pasamos mediante la funcion array. Para el segundo llamado, al argumento de la funcion le pasamos un array donde el primer argumento sera el namespace concatenado con la clase. Y como segundo argumento pasamos el metodo. Con los argumentos repetimos lo anterior con otros datos. Si lo ejecutan deben obtener igual a la anterior. La diferencia principal es como pudimos hacer llamados a elementos que esten asignados a un namespace en particular. Y siempre los argumentos que pasamos a la funcion de callback llamada sera mediante un array con todos los datos necesarios.

Anuncios

En resumen, hoy hemos visto a call_user_func_array, que es, para que sirve, como se utiliza, y una serie de ejemplos para ver las distintas formas que podemos pasar los datos, asi como tambien podemos evitar un inconveniente con call_user_func. 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.

Anuncios
pp258

Donatión

It’s for site maintenance, thanks!

$1.50