PHP admite el concepto de funciones variables. Esto significa que si un nombre de variable tiene paréntesis anexos a él, PHP buscará una función con el mismo nombre que lo evaluado por la variable, e intentará ejecutarla. Entre otras cosas, esto se puede usar para implementar llamadas de retorno, tablas de funciones, y así sucesivamente.
Las funciones variables no funcionarán con constructores de lenguaje como echo, print, unset(), isset(), empty(), include, require y similares. Utilice funciones de envoltura para hacer uso de cualquiera de estos constructores 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";
}
// Esta es una función de envoltura alrededor de echo
function hacerecho($cadena)
{
echo $cadena;
}
$func = 'foo';
$func(); // Esto llama a foo()
$func = 'bar';
$func('prueba'); // Esto llama a bar()
$func = 'hacerecho';
$func('prueba'); // Esto llama a hacerecho()
?>
Los métodos de objetos también puede ser llamados con la sintaxis de funciones variables.
Ejemplo #2 Ejemplo de método variable
<?php
class Foo
{
function Variable()
{
$nombre = 'Bar';
$this->$nombre(); // Esto llama al método Bar()
}
function Bar()
{
echo "Esto es Bar";
}
}
$foo = new Foo();
$nombrefunc = "Variable";
$foo->$nombrefunc(); // Esto llama a $foo->Variable()
?>
Cuando se llaman a métodos estáticos, la llamada a la función es más fuerte que el operador de propiedad static:
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 imprime 'propiedad estática'. No necesita una $variable en este ámbito.
$variable = "Variable";
Foo::$variable(); // Esto llama a $foo->Variable() leyendo $variable en este ámbito.
?>
A partir de PHP 5.4.0, se puede llamar a cualquier callable almacenado en una variable.
Ejemplo #4 Llamables complejos
<?php
class Foo
{
static function bar()
{
echo "bar\n";
}
function baz()
{
echo "baz\n";
}
}
$func = array("Foo", "bar");
$func(); // imprime "bar"
$func = array(new Foo, "baz");
$func(); // imprime "baz"
$func = "Foo::bar";
$func(); // imprime "bar" a partrid de PHP 7.0.0; antes, emitía un error fatal
?>
Véase también is_callable(), call_user_func(), variables variables y function_exists().
Versión | Descripción |
---|---|
7.0.0 | 'NombreDeClase::NombreDeMétodo' se permite como función variable. |
5.4.0 | Los arrays, que son llamables válidos, están permitidos como funciones variables. |