PHP_Compat を透過的に使う

PHP のマイナーバージョン間の互換性のなさはよく非難されるところなのだけれど、というか自分がよく文句を言っている点なんだけど、PHP_Compat という PEAR パッケージがあり、これである程度は吸収可能である。

PEAR :: Manual :: PHP_Compat

スクリプトに

require_once( 'PHP/Compat.php' );
PHP_Compat::loadVersion();

を加えれば PHP_Compat で提供されている関数、定数が(恐らく)すべて利用できる。

しかし PHP_Compat に依存しているファイルすべてにこの記述を足して回るのは現実的ではないし、仮にそんなことやっちゃうと、必要なくなったときに外して回るのも激しくダルい。そこで上の記述だけを記したファイルを FILENAME で用意して

php.ini に

auto_prepend_file = FILENAME

..htaccess に

php_value auto_prepend_file FILENAME

としておくと、スクリプトの方は何もいじらずに PHP_Compat の恩恵に与れる1。このファイルの読み込みは include_path の設定に左右される。

ただし PHP_Compat の働きはあくまである程度である。というのも、すでに存在している関数の挙動が PHP のバージョン間で食い違っている場合には対応できない。なぜなら PHP はスクリプトのレベルで関数のオーバーロードを許していないから。PHP_Compat はあくまで現在利用しているバージョンで存在していない関数、定数を定義してくれるものなので、利用している PHP のバージョンが中途半端に古い場合にはやはり面倒くさい問題が残る。まぁ、思いっきり古いとそれはそれで PHP_Compat レベルではどうにもならない問題があったりするわけで、どっちにしろ困った状況なんだけど。

※ auto_prepend_file は共通のモジュールの読み込みに使うと楽できるかもと思ったけど、イマドキのフロントコントローラ方式なら全然必要ないかも。

  1. リンク先のマニュアルでは append で説明されてるんだけど、append じゃ当然ダメでしょ。 

More