Llamadas dinámicas a funciones y métodos en PHP - Llamadas dinamicas a funciones y métodos en PHP
19 de Abril de 2006
Microsoft .Net, Lenguaje C
Por ejemplo, en C disponemos de punteros a funciones puros, que constan de un puntero apuntando a la dirección en memoria de la función, y en .NET disponemos de delegados (delegate), que aportan seguridad en cuanto a que se hace una comprobación de los parámetros y de sus tipos en tiempo de compilación, reduciendo así en gran medida el peligro que tiene utilizar los punteros a funciones de C. Aparte de esto .NET dispone de otros mecanismos como remoting, que nos permiten acceder dinámicamente a los atributos, métodos y propiadedes de las clases y objetos.
En PHP no existen los punteros, pero al ser un lenguaje interpretado es sencillo ofrecer funcionalidades similares. Disponemos de dos opciones, una la más simple, basada en llamar a funciones o métodos a partir de una variable string que contenga el nombre de la función o método, lo cual se denomina en PHP funciones variables, y otra, basada en la utilización de algunas funciones específicas de PHP, que nos ofrecen algo más de pontencia que el caso anterior.
A continuación se muestra un par de ejemplos en los que se realiza la llamada dinámica a una función y al método de una instancia de una clase.
/
* Defino dos funciones
*/
function uno(){
echo "función uno";
}
funcion dos(){
echo "función dos";
}
/
* Defino una clase para utilizarla como ejemplo
*/
class Prueba{
function Prueba(){}
function metodo1(){
echo "Prueba.metodo1";
}
function metodo2(){
echo "Prueba.metodo2";
}
}
/
* Ejemplo de llamada dinámica a una función
*/
$fname = 'uno';
$fname();
/
* Ejemplo de llamada dinámica a un método de un objeto
*/
$mname = 'metodo1';
$prueba =& new Prueba();
$prueba->$mname();
En el primer ejemplo se hace una llamada dinámica a una función, para ello se crea una variable string con el nombre de la función a la que hay que llamar y a continuación se realiza la llamada con $fname(). Como puede verse, para realizar la llamada utilizamos la variable que contiene el nombre de la función a la que queremos llamar y le añadimos los parétesis. En el caso de que quisiéramos pasarle parámetros, procederíamos igual que con cualquier otra función, poniéndolos simplemente entre los paréntesis.
En el segundo ejemplo, en el que llamamos al método de un objeto, el mecanismo es similar. Tras crear la instancia de la clase Prueba, realizamos la llamada al método tal como la haríamos habitualmente, pero cambiamos el nombre del método por la variable $mname, que contiene el nombre del método que desemoas llamar.
La forma explicada en el punto anterior tiene como principal inconveniente que tenemos que saber, a la hora de escribir el código, el número de parámetros a pasar a la función, lo que en algunos casos no es posible. Además adolece también del inconveniente de que en algunas situaciones no es posible utilizarlo por problemas de sintaxis. PHP dispone de un par de funciones que nos permiten resolver estos inconvenientes, call_user_func y call_user_func_params.
Mediante call_user_func podemos indicar un nombre de función y los parámetros que queremos pasarle, por ejemplo:
function saludo($nombre){
echo "Hola $nombre";
}
call_user_func('saludo', 'pepe');
Como puede apreciarse, el primer parámetro corresponde al nombre de la función que queremos llamar y el segundo parámetro es el parámetro. Si tuviéramos más parámetros bastaría con ir añadiéndolos tras este segundo.
También es posible llamar a métodos de clases de objetos, para lo cual hay que utilizar como primer parámetro un array cuya posición 0 corresponda a una instancia de objeto y cuya posición 1 sea el nombre del método al que hay que llamar. El resto de parámetros pasados a call_user_func serán los parámetros que se enviarán a dicho método. Es posible llamar también a métodos estáticos indicando en la posición 0 el nombre de la clase en vez de una instancia de objeto. Es importante al realizar llamadas a métodos de objetos, que al indicar la instancia debemos anteponerle el carácter &, ya que en caso contrario la llamada se realizaría sobre un objeto copia del indicado, debido a como trata PHP4 los objetos.
class Prueba{
function saludar($nombre){
echo "Hola $nombre";
}
}
Llamada al método de una instancia
$obj =& new Prueba();
call_user_func(array(&$obj, 'saludar'), 'pepe');
Llamada a un método de forma estática
call_user_func(array('Prueba', 'saludar'), 'pepe');
Un caso especial es cuando dentro de un método de una clase queremos llamar a otro método de la misma clase, pero para la misma instancia de objeto, no de forma estática. En el primer elemento del array no podremos indicar el nombre de la instancia, pero se puede realizar la llamada utilizando &$this en su lugar.
Hay que tener en cuenta que los parámetros call_user_func pasa a la función o método, se envían por valor, por lo que pueden darse situaciones, sobre todo cuando trabajamos con objetos, en los que esta solución no nos valga. Para estos casos disponemos de la función call_user_func_array. El tratamiento del primer parámetro en este caso es idéntico a call_user_func, la diferencia radica en la forma de indicar los parámetros. En el caso anterior los parámetros se indicaban como parámetros independientes de la función, y en este caso se indican mediante un segundo parámetro de tipo array que los contiene a todos ellos.
$params = array('pepe');
call_user_func_array(array(&$obj, 'saludar'), $params);
En PHP no existen los punteros, pero al ser un lenguaje interpretado es sencillo ofrecer funcionalidades similares. Disponemos de dos opciones, una la más simple, basada en llamar a funciones o métodos a partir de una variable string que contenga el nombre de la función o método, lo cual se denomina en PHP funciones variables, y otra, basada en la utilización de algunas funciones específicas de PHP, que nos ofrecen algo más de pontencia que el caso anterior.
Llamadas con funciones variables
A continuación se muestra un par de ejemplos en los que se realiza la llamada dinámica a una función y al método de una instancia de una clase.
/
* Defino dos funciones
*/
function uno(){
echo "función uno";
}
funcion dos(){
echo "función dos";
}
/
* Defino una clase para utilizarla como ejemplo
*/
class Prueba{
function Prueba(){}
function metodo1(){
echo "Prueba.metodo1";
}
function metodo2(){
echo "Prueba.metodo2";
}
}
/
* Ejemplo de llamada dinámica a una función
*/
$fname = 'uno';
$fname();
/
* Ejemplo de llamada dinámica a un método de un objeto
*/
$mname = 'metodo1';
$prueba =& new Prueba();
$prueba->$mname();
En el primer ejemplo se hace una llamada dinámica a una función, para ello se crea una variable string con el nombre de la función a la que hay que llamar y a continuación se realiza la llamada con $fname(). Como puede verse, para realizar la llamada utilizamos la variable que contiene el nombre de la función a la que queremos llamar y le añadimos los parétesis. En el caso de que quisiéramos pasarle parámetros, procederíamos igual que con cualquier otra función, poniéndolos simplemente entre los paréntesis.
En el segundo ejemplo, en el que llamamos al método de un objeto, el mecanismo es similar. Tras crear la instancia de la clase Prueba, realizamos la llamada al método tal como la haríamos habitualmente, pero cambiamos el nombre del método por la variable $mname, que contiene el nombre del método que desemoas llamar.
Llamadas dinámicas con call_user_func
La forma explicada en el punto anterior tiene como principal inconveniente que tenemos que saber, a la hora de escribir el código, el número de parámetros a pasar a la función, lo que en algunos casos no es posible. Además adolece también del inconveniente de que en algunas situaciones no es posible utilizarlo por problemas de sintaxis. PHP dispone de un par de funciones que nos permiten resolver estos inconvenientes, call_user_func y call_user_func_params.
Mediante call_user_func podemos indicar un nombre de función y los parámetros que queremos pasarle, por ejemplo:
function saludo($nombre){
echo "Hola $nombre";
}
call_user_func('saludo', 'pepe');
Como puede apreciarse, el primer parámetro corresponde al nombre de la función que queremos llamar y el segundo parámetro es el parámetro. Si tuviéramos más parámetros bastaría con ir añadiéndolos tras este segundo.
También es posible llamar a métodos de clases de objetos, para lo cual hay que utilizar como primer parámetro un array cuya posición 0 corresponda a una instancia de objeto y cuya posición 1 sea el nombre del método al que hay que llamar. El resto de parámetros pasados a call_user_func serán los parámetros que se enviarán a dicho método. Es posible llamar también a métodos estáticos indicando en la posición 0 el nombre de la clase en vez de una instancia de objeto. Es importante al realizar llamadas a métodos de objetos, que al indicar la instancia debemos anteponerle el carácter &, ya que en caso contrario la llamada se realizaría sobre un objeto copia del indicado, debido a como trata PHP4 los objetos.
class Prueba{
function saludar($nombre){
echo "Hola $nombre";
}
}
Llamada al método de una instancia
$obj =& new Prueba();
call_user_func(array(&$obj, 'saludar'), 'pepe');
Llamada a un método de forma estática
call_user_func(array('Prueba', 'saludar'), 'pepe');
Un caso especial es cuando dentro de un método de una clase queremos llamar a otro método de la misma clase, pero para la misma instancia de objeto, no de forma estática. En el primer elemento del array no podremos indicar el nombre de la instancia, pero se puede realizar la llamada utilizando &$this en su lugar.
Hay que tener en cuenta que los parámetros call_user_func pasa a la función o método, se envían por valor, por lo que pueden darse situaciones, sobre todo cuando trabajamos con objetos, en los que esta solución no nos valga. Para estos casos disponemos de la función call_user_func_array. El tratamiento del primer parámetro en este caso es idéntico a call_user_func, la diferencia radica en la forma de indicar los parámetros. En el caso anterior los parámetros se indicaban como parámetros independientes de la función, y en este caso se indican mediante un segundo parámetro de tipo array que los contiene a todos ellos.
$params = array('pepe');
call_user_func_array(array(&$obj, 'saludar'), $params);
Valora este capítulo:
Autor y licencia de 'Llamadas dinámicas a funciones y métodos en PHP - Llamadas dinamicas a funciones y métodos en PHP'
|
Opiniona sobre 'Llamadas dinámicas a funciones y métodos en PHP - Llamadas dinamicas a funciones y métodos en PHP' (0)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Llamadas dinámicas a funciones y métodos en PHP - Llamadas dinamicas a funciones y métodos en PHP'
Hoy parece evidente que las funciones-poderes del Estado están llamadas a una colaboración y a...
Más »
PHP se ha convertido en el lenguaje de facto de Internet y no es difícil...
Más »
PHP es un lenguaje en que usualmente el tipo de dato de una variable no...
Más »
PHP es un lenguaje de programación diseñado específicamente para aplicaciones Web; las características más destacables...
Más »
PHP es un lenguaje de programación diseñado específicamente para aplicaciones Web; las características más destacables...
Más »


