Обращение к функциям через переменные

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

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

Пример #1 Работа с функциями посредством переменных

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

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

// Функция-обертка для echo
function echoit($string)
{
    echo 
$string;
}

$func 'foo';
$func();        // Вызывает функцию foo()

$func 'bar';
$func('test');  // Вызывает функцию bar()

$func 'echoit';
$func('test');  // Вызывает функцию echoit()
?>

Вы также можете вызвать методы объекта, используя возможности PHP для работы с переменными функциями.

Пример #2 Обращение к методам класса посредством переменных

<?php
class Foo
{
    function 
Variable()
    {
        
$name 'Bar';
        
$this->$name(); // Вызываем метод Bar()
    
}
    
    function 
Bar()
    {
        echo 
"This is Bar";
    }
}

$foo = new Foo();
$funcname "Variable";
$foo->$funcname();  // Обращаемся к $foo->Variable()

?>

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

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

<?php
class Foo
{
    static 
$variable 'static property';
    static function 
Variable()
    {
        echo 
'Method Variable called';
    }
}

echo 
Foo::$variable// Это выведет 'static property'. Переменная $variable будет разрешена в нужной области видимости.
$variable "Variable";
Foo::$variable();  // Это вызовет $foo->Variable(), прочитав $variable из этой области видимости.

?>

С версии PHP 5.4.0, можно вызывать callable функцию помещенную в переменную.

Пример #4 Сallable-фукнции

<?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(); // выведет "bar" в PHP 7.0.0 и выше; в предыдущих версиях это приведет к фатальной ошибке
?>

Смотрите также is_callable(), call_user_func(), Переменные переменные и function_exists().

Список изменений

Версия Описание
7.0.0 'ClassName::methodName' доступна как функция-переменная.
5.4.0 Массивы, являющиеся корректными callable-методами, доступны как функции-переменные.