O PHP suporta o conceito de funções variáveis. Isto significa que se um nome de variável tem parênteses no final dela, o PHP procurará uma função com o mesmo nome, qualquer que seja a avaliação da variável, e tentará executá-la. Entre outras coisas, isto pode ser usado para implementar callbacks, tabelas de função e assim por diante.
Funções variáveis não funcionam com construtores de linguagem como echo, print, unset(), isset(), empty(), include, require e outras assim. Utilize uma função de wrapper para usar quaisquer um destes construtores como uma função variável.
Exemplo #1 Exemplo de funções variáveis
<?php
function foo() {
echo "Chamou foo()<br>\n";
}
function bar($arg = '')
{
echo "Chamou bar(); com argumento '$arg'.<br />\n";
}
// Essa eh uma funcao wrapper para echo()
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // Chama foo()
$func = 'bar';
$func('test'); // Chama bar()
$func = 'echoit';
$func('test'); // Chama echoit()
?>
Um metodo de um objeto também pode ser chamado com a sintaxe de funções variáveis.
Exemplo #2 Exemplo de chama de método variável
<?php
class Foo
{
function MetodoVariavel()
{
$name = 'Bar';
$this->$name(); // Isto chama o método Bar()
}
function Bar()
{
echo "Bar foi chamada!";
}
}
$foo = new Foo();
$funcname = "MetodoVariavel";
$foo->$funcname(); // Isto chama $foo->MetodoVariavel()
?>
Quando chamando métodos estáticos, uma chamada de função tem preferência que uma propriedade estática.
Exemplo #3 Método variávei com propriedades estáticas
<?php
class Foo
{
static $variable = 'static property';
static function Variable()
{
echo 'Method Variable called';
}
}
echo Foo::$variable; // This prints 'static property'. It does need a $variable in this scope.
$variable = "Variable";
Foo::$variable(); // This calls $foo->Variable() reading $variable in this scope.
?>
A partir do PHP 5.4.0, você pode guardar qualquer callable numa variável.
Exemplo #4 Callables complexos
<?php
class Foo
{
static function bar()
{
echo "bar\n";
}
function baz()
{
echo "baz\n";
}
}
$func = array("Foo", "bar");
$func(); // prints "bar"
$func = array(new Foo, "baz");
$func(); // prints "baz"
$func = "Foo::bar";
$func(); // prints "bar" a partir PHP 7.0.0; anteriormente lança um erro fatal
?>
Veja também is_callable(), call_user_func(), variáveis variáveis e function_exists().
Versão | Descrição |
---|---|
7.0.0 | 'ClassName::methodName' é permitido função variável. |
5.4.0 | Arrays são callables, também permitidos como função variável. |