Variable functions
Оновлено: 11.05.2023
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"
?>