## 可变函数

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";
    }

    // 使用 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 "This is Bar";
        }
    }

    $foo = new Foo();
    $funcname = "Variable";
    $foo->$funcname();  // 调用 $foo->Variable()

    ?>

当调用静态方法时，函数调用要比静态属性优先：

示例 #3 Variable 方法和静态属性示例

    <?php
    class Foo
    {
        static $variable = 'static property';
        static function Variable()
        {
            echo 'Method Variable called';
        }
    }

    echo Foo::$variable; // 打印 'static property'。在该作用域中需要 $variable。
    $variable = "Variable";
    Foo::$variable();  // 在该作用域中读取 $variable 调用 $foo->Variable()。

    ?>

示例 #4 复杂调用

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

### 参见

- is_callable()
- call_user_func()
- function_exists()
- 可变变量

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open