ishida

2013.08.29

リフレクション入門

ご挨拶

シュバルツシルトドラゴンを求めて黒輪縛鎖を買い続けているけれど、まだ一枚も手に入っていないカードファイター石田です。おかげさまでネビュラロードドラゴン中心のデッキは作れましたが、やはりそこは連携ライドのロマンを追いたいですよね。現状のリンクジョーカーはよく言われるほど凶悪なクランではないと思うのですが対戦者にどうも嫌な顔されるのが辛い今日この頃です。

リフレクションって何?

PHPにはリフレクションという機能があります。リフレクションが何かを分かっている人にとっては「おいおい、PHPにリフレクションなんか必要ねーだろ」みたいな声が聞こえてきそうです。
「だって……

とか出来ちゃうじゃん要らないじゃん!」

いや、ごもっともなんですが実際に必要な時も有るんだよということは読み進めてもらえるとなんとなく伝わるかと思います。さて、本節はリフレクションが分からない人向けの説明です。が、うだうだ書こうと思ったところ良い説明がWebで見付かったので、それを引用しちゃいます。

リフレクションは、プログラムの中でそのプログラムに含まれる型や変数/メソッドの情報を参照/操作できるようにする仕組みです。Javaではjava.lang.reflectパッケージに、.NET FrameworkではSystem.Reflection名前空間に、それぞれリフレクションを利用するためのクラスが用意されています。Ruby、Python、PHP(PHP:Hypertext Preprocessor)などのスクリプト言語も、リフレクションの機能を備えています。

引用元: 日経BPのコラム

ということですね。しかし、PHPは文字列変数から名前の一致するクラスをそのまま newしたり、文字列の変数からメソッド名を指定して実行出来ちゃったりするので、そんなに必要無いんじゃないかって話ではあります。実際に知らなくてもあまり困ることも無いんじゃないかと思います。しかし、単体テストをし易いクラス設計をするための基盤を作ったり、しょーもないコードを減らしたい時には意外と重要だったりもするのです。実際のリフレクションAPIの詳細についてはマニュアルを当ってもらった方が分かり易いと思いますので、本記事では概略と実際にどうやって使うのかという話をしていこうと思います

リフレクションAPIの構成要素

実際には、ここで挙げる以外にも有るのですが僕の独断と偏見で主に使うと思い込んでいるモノだけ紹介しようと思います。もっと詳しく知りたい方は先述のマニュアルを読んでください。

ReflectionClass

クラスの構造を取り出したりインスタンス化したりします

ReflectionMethod

メソッドの構造を取り出したりメソッドを実行したり、メソッドからパラメータの定義を取りだしたりします。現状ではタイプヒンティングは取り出せません

ReflectionParameter

パラメータの定義です。現状ではタイプヒンティングは取り出せません

ReflectionProperty

プロパティの定義です。プロパティにアクセスしたりします

では、実際これらをどのように使うのか? ということについて解説していこうと思います。次のコードを見てみてください。これはよく言うところのDI(依存性を注入しながらnewしてくれるやつ)みたいなモノです。実用したりするのは循環構造で依存している場合を考慮したりしないとイケないので、そういうのは頑張ってください。ソースコード中にコメントの形で解説を挟むので読んで理解してください。

なんとなく、どんなことが出来るのか? というのが掴めたのではないかと思います。実際には業務ロジックで使えるシーンは殆ど無いのではないかと思います。しかし、プロジェクトのスタートアップ時に、フルスタックなフレームワークを使う程、大きくないし…… とか、目的特化の基盤を作りたいし…… みたいなシーンでは活躍するのではないでしょうか? 依存性注入の他には、こんな目的にも使えそうです

  • ・異るクラスのインスタンス間でのディープコピー自動化

  • ・POPO(Plain Old PHP Object)のままでORマッピング

  • ・POPO(Plain Old PHP Object)を、そのままMVCのコントローラとして利用する

などなど。PHPの場合、勿論リフレクションじゃなくても出来ることも有ると思いますが、夢と利用方法は広がっていくんじゃないかと思います。しょーもない代入をひたすら繰り返すだけのコードを撒き散らす必要が生まれそうになったらリフレクションのことを思い出してみてください。

終わりに

アライドアーキテクツではリンクジョーカー相手でも爽やかにファイトしてくれるカードファイターと、リフレクションが大好きだけど”DI”という言葉を使うのはこそばゆい派のエンジニアを募集しています。