可変関数
PHP は可変関数(variable functions)の概念をサポートします。 これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。 この機能は、コールバック、関数テーブル等を実装するために使用可能です。
可変関数は、echo, print, isset(), empty(), include, require のような言語構造と組み合わせて使用する ことはできません。これらの言語構造を可変変数として使うには 独自のラッパー関数を使う必要があります。
例1 可変関数の例
<?phpfunction 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 可変メソッドの例
<?phpclass Foo{ function Variable() { $name = 'Bar'; $this->$name(); // Bar() メソッドのコール } function Bar() { echo "This is Bar"; }}$foo = new Foo();$funcname = "Variable";$foo->$funcname(); // $foo->Variable() をコールする?>
静的メソッドをコールするときには、関数呼び出しのほうが静的プロパティ演算子よりも優先されます。
例3 静的プロパティを含む可変メソッドの例
<?phpclass 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
<?phpclass 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" を表示します。?>