Funciones variables

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 de mismo nombre y intentará ejecutarla. Esto puede servir, entre otras cosas, para hacer funciones de devolución de llamada, 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
"en foo()<br />\n";
}

function
bar($arg = '')
{
echo
"En bar(); el argumento era '$arg'.<br />\n";
}

// Esto es una función desviada de echo
function echoit($string)
{
echo
$string;
}

$func = 'foo';
$func(); // Llama a foo()

$func = 'bar';
$func('test'); // Llama a bar()

$func = 'echoit';
$func('test'); // Llama a echoit()
?>

También se pueden llamar 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 callables complejo

<?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"