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 из этой области видимости.
?>
Смотрите также is_callable(), call_user_func(), Переменные переменные и function_exists().