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"
?>