Capitulos de este wiki
  1. 1 Llamadas dinamicas a funciones y métodos en PHP

Llamadas dinámicas a funciones y métodos en PHP - Llamadas dinamicas a funciones y métodos en PHP

1 - Llamadas dinamicas a funciones y métodos en PHP

[editar]
Tutorial creado por Patxi Echarte. Extraido de: http://www.eslomas.com/index.php/archives/2005/12/22/llamadas-dinamicas-funciones-metodos-php/
19 de Abril de 2006
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.

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);
[editar]

Sé el primero en opinar


Tutoriales relacionados con 'Llamadas dinámicas a funciones y métodos en PHP'

En algunos lenguajes tenemos la opción de utilizar punteros a funciones o soluciones similares, que... Más »

Autor y licencia de 'Llamadas dinámicas a funciones y métodos en PHP'

De forma general todos los contenidos de este web están sujetos a una licencia del tipo Creative Commons “Algunos derechos reservados”. Salvo que se diga lo contrario la única restricción impuesta si quieres utilizar algo de lo que aparece en este web, es la de indicar que el autor soy yo, Patxi Echarte.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.