PHP поддерживает концепцию переменных функций. Это означает, что если к имени переменной добавлены круглые скобки, PHP будет искать функцию с тем же именем, что и значение переменной, и попытается ее выполнить. Помимо прочего, это можно использовать для реализации обратных вызовов, таблиц функций и т. д.

Функции переменных не будут работать с языковыми конструкциями, такими как echo , print , unset() , isset() , empty() , include , require и т.п. Используйте функции-оболочки, чтобы использовать любую из этих конструкций в качестве переменных функций.

Пример #1 Пример функции переменной

<?php
function foo() {
    echo "In foo()<br />\n";
}

function bar($arg = '')
{
    echo "In bar(); argument was '$arg'.<br />\n";
}

// This is a wrapper function around echo
function echoit($string)
{
    echo $string;
}

$func = 'foo';
$func();        // This calls foo()

$func = 'bar';
$func('test');  // This calls bar()

$func = 'echoit';
$func('test');  // This calls echoit()
?>

Методы объекта также можно вызывать с синтаксисом переменных функций.

Пример #2 Пример метода переменной

<?php
class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }
    
    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();  // This calls $foo->Variable()

?>

При вызове статических методов вызов функции сильнее, чем оператор статического свойства:

Пример #3 Пример метода переменных со статическими свойствами

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

?>

Пример #4 Сложные вызываемые объекты

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