PHPでは関数を文字列から呼び出したりクラスを文字列から作ることができます。
こういうことができると柔軟にクラスや関数を扱えて便利なんですよね。
PHPで文字列から呼び出されることが多いのは次の3つ
- グローバルな関数
- クラス
- クラス関数
特にクラス関数は文字列から渡すことが多く、やり方を知っておくと便利です。
ということでPHPで文字列から何かを呼び出す方法についてまとめます。
グローバル関数を文字列から呼び出し
グローバルな関数はどのクラスにも属してない一番外側に書かれる関数です。
その呼び出し方は次のような方法
例えば次のような関数があったとしましょう。
1 2 3 |
function say_hello(){ print_r('Hello!'); } |
これを文字列として呼び出しているのがつぎのコード例
1 2 |
$func = 'say_hello'; $func(); |
やっていることは単純で
- 関数名 'say_hello' を変数 $func に代入
- 変数に () を付けて呼び出し
という風にするだけです。
ちなみに文字列に () を付けて呼び出すことは不可能なので次のようなコードはNGです。
1 2 |
/** これはNG */ 'say_hello'(); |
あくまで変数経由での呼び出しが必要になります。
※ PHP7ではこの記述がOKになった模様(後述)
このルールは後で紹介するクラスやクラス関数でも同じです。
訂正 : PHP7では文字列から直接実行可
コメントからこういう指摘をいただきました。
文字列から関数を実行する際の注意点に
1234 function hello(){echo 'hello';}'hello'(); // hellophp7 では実行できる。
もう一つ
a.php
1 call('hello'); //b.php の call関数を実行b.php
123456 function call($func){$func(); // error undefined function}function hello(){ // b.phpecho 'hello';}👆 hello関数の定義は 呼び出し元の a.phpにある必要がある。
ご指摘ありがとうございました。
クラスインスタンスを文字列から作成
次はクラスのインスタンスを文字列から作成する方法です。
例えば次のようなクラスがあったとしましょう。
1 2 3 4 5 |
class Hoge{ function __construct(){ print_r('hoge hoge'); } } |
普通このこういうクラスがあればインスタンス化するには次のような感じのコードを書きます。
1 |
$hoge = new Hoge(); |
new を使うのはPHPだけでなく他の言語でもなじみ深いですよね。
ですがPHPならクラスまでも文字列から呼び出すことが可能です。
例えば次のように
1 2 |
$hoge_name = 'Hoge'; $hoge = new $hoge_name; |
$hoge_name にクラス名を代入してその変数に対して new を使っています。
そしてクラスのインスタンスは $hoge に代入されています。
ただし関数の時と同じように直接文字列からインスタンス化はできないので要注意
1 |
$hoge = new 'Hoge'(); |
変数に対してクラスをインスタンス化することが必要です。
慣れないとこういう書き方をしてしまいそうになるので気を付けたいところです。
クラス関数を文字列から呼び出し
最後はクラス内の関数を文字列から呼び出す方法です。
これについては慣れないと少し違和感があるかもしれません。
その呼び出し方というのが次の通り
まず次のようにFugaクラスを考えてその中にsay_my_name関数を定義したとしましょう。
1 2 3 4 5 |
class Fuga{ function say_my_name(){ print_r('My name is Fuga'); } } |
このコードでsay_my_name関数を普通に呼び出すなら次のような書き方をします。
1 2 |
$fuga = new Fuga(); $fuga->say_my_name(); |
これが普通にインスタンス化して呼び出す一般的な方法です。
ではこれと同じことを文字列からやるにはどうすればいいか・・・
というと次のコード例みたいな呼び出し方をします。
1 2 3 |
$fuga = new Fuga(); $fuga_func = array( $fuga, 'say_my_name' ); $fuga_func(); |
上のコードのように array( インスタンス変数, 'クラス関数名' ) として配列を作ります。
そしてそれを普通の関数と同じように () をつけて関数として実行するだけです。
またインスタンス変数を作らずにクラスと関数を両方文字列で呼び出す方法もあり
1 2 |
$fuga_func = array( 'Fuga', 'say_my_name' ); $fuga_func(); |
こういう風にインスタンス変数が無くても呼び出しは可能です。
ただしインスタンス変数なしで呼び出すと関数内で $this が使えない点に注意が必要
これがクラス関数を文字列から呼び出す方法です。
最初は違和感ありまくりでしたが、今は不思議と慣れてきました。
むしろこういう柔軟な書き方ができると色々拡張性が高くなって便利です。
ここまでのまとめ
ここまでのことを簡単にまとめたのが次の通り
- グローバルな関数の呼び出し
次のような感じで文字列から呼び出し
12$func = 'say_hello';$func();ただし文字列に直接 () をつけて呼び出せないので注意
- クラスのインスタンス化
次のような感じで文字列からインスタンス化
12$hoge_name = 'Hoge';$hoge = new $hoge_name;クラス名の変数を作る ⇒ new で変数をインスタンス化、という流れ
- クラス関数の呼び出し
次のような感じで文字列から関数呼び出し
123$fuga = new Fuga();$fuga_func = array( $fuga, 'say_my_name' );$fuga_func();クラスと関数名を持つarrayを宣言 ⇒ 関数として呼び出し、という流れ
以上が文字列から関数やらクラスを色々呼び出したり生成する方法です。
PHPで開発してるとよく使うので自分の記憶の整理も兼ねてまとめてみました。
ではでは($・・)/~~~