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"
?>
0 комментариев