PHPで関数やクラスを文字列から呼び出しする方法まとめ

PHPでは関数を文字列から呼び出したりクラスを文字列から作ることができます。

こういうことができると柔軟にクラスや関数を扱えて便利なんですよね。

ということでPHPで文字列から何かを呼び出す方法についてまとめます。

文字列での呼び出し方まとめ

PHPで文字列から呼び出されることが多いのは次の3つ

  • グローバルな関数
  • クラス
  • クラス関数

特にクラス関数は文字列から渡すことが多く、やり方を知っておくと便利です。

ではそれぞれのやり方について簡単に説明しようと思います。

グローバルな関数の呼び出し

グローバルな関数はどのクラスにも属してない一番外側に書かれる関数です。

その呼び出し方は次のような方法

 

例えば次のような関数があったとしましょう。

 

これを文字列として呼び出しているのがつぎのコード例

やっていることは単純で

  1. 関数名 'say_hello'  を変数  $func  に代入
  2. 変数に  ()  を付けて呼び出し

という風にするだけです。

 

ちなみに文字列に  ()  を付けて呼び出すことは不可能なので次のようなコードはNGです。

あくまで変数経由での呼び出しが必要になります。

このルールは後で紹介するクラスやクラス関数でも同じです。

クラスを文字列から作成

次はクラスのインスタンスを文字列から作成する方法です。

例えば次のようなクラスがあったとしましょう。

 

普通このこういうクラスがあればインスタンス化するには次のような感じのコードを書きます。

new  を使うのはPHPだけでなく他の言語でもなじみ深いですよね。

 

ですがPHPならクラスまでも文字列から呼び出すことが可能です。

例えば次のように

$hoge_name  にクラス名を代入してその変数に対して  new  を使っています。

そしてクラスのインスタンスは  $hoge  に代入されています。

 

ただし関数の時と同じように直接文字列からインスタンス化はできないので要注意

変数に対してクラスをインスタンス化することが必要です。

慣れないとこういう書き方をしてしまいそうになるので気を付けたいところです。

クラス関数

最後はクラス内の関数を文字列から呼び出す方法です。

これについては慣れないと少し違和感があるかもしれません。

その呼び出し方というのが次の通り

 

まず次のようにFugaクラスを考えてその中にsay_my_name関数を定義したとしましょう。

このコードでsay_my_name関数を普通に呼び出すなら次のような書き方をします。

これが普通にインスタンス化して呼び出す一般的な方法です。

 

ではこれと同じことを文字列からやるにはどうすればいいか・・・

というと次のコード例みたいな呼び出し方をします。

上のコードのように  array( インスタンス変数, 'クラス関数名' )  として配列を作ります。

そしてそれを普通の関数と同じように  ()  をつけて関数として実行するだけです。

 

またインスタンス変数を作らずにクラスと関数を両方文字列で呼び出す方法もあり

こういう風にインスタンス変数が無くても呼び出しは可能です。

ただしインスタンス変数なしで呼び出すと関数内で  $this  が使えない点に注意が必要

 

これがクラス関数を文字列から呼び出す方法です。

最初は違和感ありまくりでしたが、今は不思議と慣れてきました。

むしろこういう柔軟な書き方ができると色々拡張性が高くなって便利です。

ここまでのまとめ

ここまでのことを簡単にまとめたのが次の通り

  • グローバルな関数の呼び出し

    次のような感じで文字列から呼び出し

    ただし文字列に直接 () をつけて呼び出せないので注意

  • クラスのインスタンス化

    次のような感じで文字列からインスタンス化

    クラス名の変数を作る ⇒ new で変数をインスタンス化、という流れ

  • クラス関数の呼び出し

    次のような感じで文字列から関数呼び出し

    クラスと関数名を持つarrayを宣言 ⇒ 関数として呼び出し、という流れ

     

以上が文字列から関数やらクラスを色々呼び出したり生成する方法です。

PHPで開発してるとよく使うので自分の記憶の整理も兼ねてまとめてみました。

ではでは($・・)/~~~

PHP

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください