可変関数

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

可変関数は、echo, print, 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();        // 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() をコールする

?>

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

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

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

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

?>

PHP 5.4.0 移行では、変数に格納されたあらゆる callable を呼び出せます。

例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(); // PHP 7.0.0 以降では "bar" を表示します。それより前のバージョンでは fatal error となっていました
?>

is_callable()call_user_func()可変変数、そして function_exists()も参照してください。

変更履歴

バージョン 説明
7.0.0 'ClassName::methodName' 形式を可変関数として使えるようになりました。
5.4.0 callable の配列を、可変関数として使えるようになりました。