PHPカンファレンス沖縄
LT(5分)

PHPでモンキーパッチを当てる

nazonohito51 川島慧 nazonohito51

モンキーパッチという言葉をご存知でしょうか?
プログラミング言語により若干意味は異なるようですが、一般的には元のソースコードは書き換えずに、実行時にそのコードを拡張してしまうという手法のことです。
過去にはゲリラパッチと呼ばれていた時代もあり、言語のルールを超えたり、あるいはフレームワーク・ライブラリを制作者の意図に反する動きをさせることが出来たりと正真正銘の闇の技術です。

PHPにおいては、せいぜいrunkitといったC言語レベルでの拡張によって実現ができるくらいなので、PHPはモンキーパッチしづらい言語であると言えるかと思います。
ですがC言語レベルの拡張を使わずともStreamWrapperというマイナーな言語組み込みの機能を使うことにより・・・実は可能です。
PHPファイルに書かれたソースコードがincludeされる直前に、そのコードを書き換えてしまうなんていうとんでもないことが可能なのです。
これを使うことにより、本当に色々なことが出来ます。

  • フレームワークのコアコードを書き換えずにその振る舞いを変えてしまう
  • 本来モックにできない言語組み込みの関数を呼び出している箇所を、自分たちの関数呼び出しに変換することでモック化してしまう
  • 本番環境のAPIを呼び出しているコードのURLを書き換えてテスト環境に向けさせる
  • PHPStanが解析対象を読み込む際に、実行されると困る副作用の処理を削除して無効化したり、重複クラスの読み込みを直前にクラス名を書き換えて回避する

今回はそんな闇の技術の裏側の実装のお話や、実際に皆様がすぐお使いいただけるライブラリを作ってしまったのでご紹介させていただければと思います。