基本
可変関数は、変数に格納された文字列を関数名として解釈して実行するもの。
変数の後に()
がある場合、PHPは変数の値の文字列を関数名として実行しようとする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php function add(int $a, int $b) { echo $a + $b, PHP_EOL; } function subtract(int $a, int $b) { echo $a - $b, PHP_EOL; } $f = 'add'; $f(1, 2); // 3 $f = 'subtract'; $f(1, 2); // -1 |
文字列に対応する関数が存在しない場合や値が文字列でない場合にはエラーとなる。
1 2 3 4 5 6 7 |
$f = 'multiply'; $f(1, 2); // Error: Call to undefined function multiply() $f = 100; $f(1, 2); // Error: Function name must be a string |
言語構造の場合
echo
やeval
といった言語構造については、可変関数として使えない。これらを使う場合にはラッパー関数を定義する。
1 2 3 4 5 6 7 8 9 10 |
$f = 'eval'; $f('echo "Hello" . PHP_EOL;'); // Error: Call to undefined function eval() function wrapper($str) { return eval($str); } $f = 'wrapper'; $f('echo "Hello" . PHP_EOL;'); // Hello |
ビルトイン関数
ビルトイン関数は使用可能。
1 2 3 |
$f = 'sqrt'; echo $f(2), PHP_EOL; // 1.4142135623731 |
メソッド
クラスのstaticメソッドやインスタンスメソッドに対しても使用可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class Person { public static function greet() { echo 'Hello', PHP_EOL; } private $name; public function __construct($name) { $this->name = $name; } public function introduce() { echo 'My name is ', $this->name, PHP_EOL; } } $tom = new Person('Tom'); $say_a_word = 'greet'; Person::$say_a_word(); // Hello $say_a_word = 'introduce'; $tom->$say_a_word(); // My name is Tom |