(PHP) 可変関数とは?【使い方・メリットなど】

(PHP) 可変関数とは?【使い方・メリットなど】

 

本記事では、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

 

可変関数でエラーになる使い方

以下の可変関数の使い方はエラーになってしまうので気をつけよう。

  • 文字列に対応する関数が存在しない場合
  • 値が文字列でない場合

$f = 'multiply';
$f(1, 2);
// Error: Call to undefined function multiply()

$f = 999;
$f(1, 2);
// Error: Function name must be a string

 

 

言語構造は使えない

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
  • print
  • function
  • for
  • foreach
  • array()
  • break
  • const
  • die()
  • empty()
  • eval()
  • exit()
  • isset()
  • list()
  • return

 

言語構造は字句解析の段階でトークンに変換される。
そのため、言語構造の記述に誤りがあると Parse error: … と表示される。

https://www.php.net/manual/ja/control-structures.intro.php

 




 

ビルトイン関数は使用可能

ビルトイン関数は可変関数で使用可能だ。

$f = 'sqrt';
echo $f(2);
// 1.4142135623731

 

ビルトイン関数とは

ビルトイン関数とは、PHPの基本的な組み込み関数のことで、
ユーザが独自に定義した関数以外の関数を言う。

https://www.php.net/manual/ja/functions.internal.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』という具合に変わっていく。

これが可変の意味だ。

 

関連記事

(PHP) 変数展開で文字列の中に変数を埋め込む方法
(PHP)「self::」と「$this」の違い【使い分け方なども紹介】
(PHP) GETとPOSTの違い【適切な使い分け方も解説】

 

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

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。