PHP soporta el concepto de funciones variables. Esto significa que si el nombre de una variable es seguido de paréntesis, PHP buscará una función con el mismo nombre y tratará de ejecutarla. Esto puede servir, entre otros, para hacer funciones de retrollamada, tablas de funciones...
Las funciones variables no pueden funcionar con los elementos de lenguaje como los echo, print, unset(), isset(), empty(), include, require etc. Se debe utilizar su propia gestión de funciones para utilizar uno de estos elementos de lenguaje como funciones variables.
Ejemplo #1 Ejemplo de función variable
<?php
function foo() {
echo "dentro de foo()<br />\n";
}
function bar($arg = '')
{
echo "Dentro de bar(); el argumento era '$arg'.<br />\n";
}
// Esto es una función desviada de echo
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // Llamada a foo()
$func = 'bar';
$func('test'); // Llamada a bar()
$func = 'echoit';
$func('test'); // Llamada a echoit()
?>
También se puede llamar a los métodos de un objeto utilizando el sistema de funciones variables.
Ejemplo #2 Ejemplo de método variable
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // Llama al método Bar()
}
function Bar()
{
echo "Es Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Llama a $foo->Variable()
?>
Al llamar a métodos estáticos, la llamada de función es mejor que el operador de propiedad estática:
Ejemplo #3 Ejemplo de método variable con propiedades estáticas
<?php
class Foo
{
static $variable = 'propiedad estática';
static function Variable()
{
echo 'Método Variable llamado';
}
}
echo Foo::$variable; // Esto muestra 'propiedad estática'. Es necesario tener una $variable en el contexto.
$variable = "Variable";
Foo::$variable(); // Esto llama a $foo->Variable(), leyendo así la $variable desde el contexto.
?>
Ejemplo #4 Llamadas complejas
<?php
class Foo
{
static function bar()
{
echo "bar\n";
}
function baz()
{
echo "baz\n";
}
}
$func = array("Foo", "bar");
$func(); // Muestra "bar"
$func = array(new Foo, "baz");
$func(); // Muestra "baz"
$func = "Foo::bar";
$func(); // Muestra "bar"