Функции переменных

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

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

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

<?php

function foo() {
echo
"В foo()<br />\n";
}

function
bar($arg = '')
{
echo
"В bar(); аргумент был '$arg'.<br />\n";
}

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

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

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

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

?>

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

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

<?php

class Foo
{
function
Variable()
{
$name = 'Bar';
$this->$name(); // Вызывает метод Bar()
}

function
Bar()
{
echo
"Это Bar";
}
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Вызывает $foo->Variable()

?>

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

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

<?php

class Foo
{
static
$variable = 'статическое свойство';

static function
Variable()
{
echo
'Вызов метода Variable';
}
}

echo
Foo::$variable; // Это выведет «статическое свойство». В области видимости класса нужна переменная $variable
$variable = "Variable";
Foo::$variable(); // Вызывает $foo->Variable() после прочтения переменной $variable в текущей области видимости

?>

Пример #4 Сложные callable-функции

<?php

class Foo
{
static function
bar()
{
echo
"bar\n";
}

function
baz()
{
echo
"baz\n";
}
}

$func = array("Foo", "bar");
$func(); // Выведет "bar"
$func = array(new Foo(), "baz");
$func(); // Выведет "baz"
$func = "Foo::bar";
$func(); // Выведет "bar"

?>
To Top