## 可変関数

PHP は可変関数(variable functions)の概念をサポートします。 これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。 この機能は、コールバック、関数テーブル等を実装するために使用可能です。

可変関数は、echo, print, unset(), isset(), empty(), include, require のような言語構造と組み合わせて使用する ことはできません。これらの言語構造を可変関数として使うには 独自のラッパー関数を使う必要があります。

例1 可変関数の例

    <?php
    function foo()
    {
        echo "In foo()\n";
    }

    function bar($arg = '')
    {
        echo "In bar(); argument was '$arg'.\n";
    }

    // これは、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(); // Bar() メソッドのコール
        }

        function Bar()
        {
            echo "This is Bar";
        }
    }

    $foo = new Foo();
    $funcname = "Variable";
    $foo->$funcname();  // $foo->Variable() をコールする

staticメソッドをコールするときには、関数呼び出しのほうがstaticプロパティ演算子よりも優先されます。

例3 staticプロパティを含む可変メソッドの例

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

    echo Foo::$variable ."\n"; // これは 'static property' を表示します。このスコープにおいて $variable が必要です。
    $variable = "Variable";
    Foo::$variable();  // これは $foo->Variable() をコールします。このスコープでの $variable の内容を読むからです。

上の例の出力は以下となります。

    static property
    Method Variable called

例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" を表示します。

### 参考

- is_callable()
- call_user_func()
- function_exists()
- 可変変数

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