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"