本記事では、PHPの
可変関数という機能について使い方やメリットなどを紹介していく。
可変関数とは・使い方
可変関数とは、
変数に格納された文字列を関数名として解釈して実行する機能のことだ。
変数の末尾に()がついている場合、
PHPは変数の値の文字列を関数名として実行しようとする。
<?php
function add($a, $b) {
echo $a + $b;
}
function subtract($a, $b) {
echo $a - $b;
}
$f = 'add';
$f(1, 2);
// 3
$f = 'subtract';
$f(1, 2);
// -1
言語構造は使えない
echoやevalといった、
言語構造については、可変関数として使うことはできない。
これらを使う場合にはラッパー関数を定義する。
$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
言語構造は英語で language constructs(ランゲージコンストラクト)のこと。
言語を構成する要素のことで、if
や else
、for
などが言語構造になる。
言語構造は、最初から存在しているため、ユーザ自身が定義しなくても利用できる。
- if
- else
- elseif
- echo
- function
- for
- foreach
- array()
- break
- const
- die()
- empty()
- eval()
- exit()
- isset()
- list()
- return
言語構造は字句解析の段階でトークンに変換される。
そのため、言語構造の記述に誤りがあると Parse error: …
と表示される。
ビルトイン関数は使用可能
ビルトイン関数は可変関数で使用可能だ。
$f = 'sqrt';
echo $f(2);
// 1.4142135623731
ビルトイン関数とは、PHPの基本的な組み込み関数のことで、
ユーザが独自に定義した関数以外の関数を言う。
クラスメソッドは使用可能
クラスのstaticメソッドや通常のメソッドに対しても可変関数は使用可能だ。
PHP
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
可変関数のメリット
可変関数を使うと、
コードをより効率的に記述できるケースがある。
例えば、
引数をたしたり、ひいたり、かけたり、わったりする関数があったとする。
これらを実行するなら以下の通りになる。
<?php
function kansu1($a,$b){
echo $a+$b;
}
function kansu2($a,$b){
echo $a-$b;
}
function kansu3($a,$b){
echo $a*$b;
}
function kansu4($a,$b){
echo $a/$b;
}
kansu1(9,3);
kansu2(9,3);
kansu3(9,3);
kansu4(9,3);
最後の実行するコードが少しみっともない感じがする。
上記を可変関数を使って記述してみる。
<?php
function kansu1($a,$b){
echo $a+$b;
}
function kansu2($a,$b){
echo $a-$b;
}
function kansu3($a,$b){
echo $a*$b;
}
function kansu4($a,$b){
echo $a/$b;
}
for ($i = 1; $i <5; $i++) {
$betumei = "kansu$i";
$betumei(9,3);
}
すこし見栄えが良くなった。
ループされて『$betumei』という変数の中身が『kansu1』⇒『kansu2』⇒『kansu3』⇒『kansu4』という具合に変わっていく。
これが可変の意味だ。
関連記事
https://www.php.net/manual/ja/functions.variable-functions.php
https://phpspot.net/php/pg%E5%8F%AF%E5%A4%89%E9%96%A2%E6%95%B0.html
以下の可変関数の使い方はエラーになってしまうので気をつけよう。