【PHP】privateなメソッドを外部から実行する。

PHP5.4から実装されたClosure::bind()を用いる。

たとえば下記のようなコード。

当然Fatal error: Call to private method hello::world() from contextと怒られる。

しかしClosure::bind()を次のように用いると。

なんと画面にhello Worldが表示される。

第1引数に渡した関数内の処理は、第3引数に渡した名前のクラス内で実行されているものとして扱われるため、正常に関数を呼び出すことができている。 そう、Closure::bind()無名関数に限り実行時コンテキストを動的に変更できるというチート機能を有しているのである。

これを応用すると、PHPUnitでのテストケースにおいてもprivateな関数をテストすることができるようになるため、非常に強力な機能の一つであると言える。