Funções variáveis

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.

Example #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 é uma função 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 método de um objeto também pode ser chamado com a sintaxe de funções variáveis.

Example #2 Exemplo de chamada de um 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.

Example #3 Método variávei com propriedades estáticas

<?php
class Foo
{
    static $variable = 'propriedade estática';
    static function Variable()
    {
        echo 'Método chamado';
    }
}

echo Foo::$variable; // Isto imprime 'propriedade estática'. Ele busca $variable no escopo da classe.
$variable = "Variable";
Foo::$variable();  // Isto chama $foo->Variable(), lendo a $variable no escopo da chamada.

?>

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