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() をコールする
?>
staticメソッドをコールするときには、関数呼び出しのほうがstaticプロパティ演算子よりも優先されます。
例3 staticプロパティを含む可変メソッドの例
<?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 の内容を読むからです。
?>
例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" を表示します。
?>