LOGSTACK

Tips for programming

php 5.4 用のシステムを 5.2 で動く様にする

PHP

php 5.4 用のシステムを 5.2 で動く様にする

PHP5.4向けの自作フレームワークで作成したシステムが、
納品直前でサーバがPHP 5.2であることが判明しました。

結局エンジンを5.2用に改造することになったのですが、
かなり手間がかかりましたので、今後のために要点を記録しておきます。

1.無名関数が使えない

無名関数が使えないので、これはひたすらに外だし。

2.オートローダーに無名関数が使えない

上記にも関連しますが、spl_autoload_register()に関数の直指定ができないため、
これを外だし。

などとやっていたのを、

のように改造

3.クラス名を変数にして、staticメソッドを呼べない

が出来ない。これらは全部、call_user_func() で代用する。

4.get_called_class() が使えない。

上記コードが動きません。
ネットで探すと、debug_backtrace()をパースする方法が代替メソッドとして例がいくつかありましたが、
どれもこれも完全には動作しませんでした。

そんな中、デフォルト引数に __CLASS__ を渡すという方法で
対処する手法が紹介されているのを見つけました。
http://qiita.com/Hiraku/items/2f4e3c146857010b4ff6

これすごいな!と感動し、試してみました。
サイトにも書かれていますが、上記コードを例にとると、

要は派生先に同名のメソッドを追加し、__CLASS__を親へ親へと渡していき、起因となるクラスを特定します。
ちょっと面倒くさいですが、debug_backtrace()を使うよりは確実と思います。

5.アクセサで同様の問題

が動きません。
4.の方法をそのまま適用すると、

という定義になり、「ゲッターに引数二つ指定できないぜ」と言われます。
仕方がないので、継承先クラスに BASE のゲッターをそのままコピペしました…。
いい代替法があるのだろうか?

6.$_POSTで、フォームからpostしたデータが取得できない

これが一番悩みました。
$_GETは受け取れる。しかし、$_POSTがどうしても空になってしまう。
なんで???と、悩むこと丸一日。

これで、内容が空になってしまうという…。
最終的に、.htaccessを消してみたら動いたので解決。

と書いていたのがまずかったようで、
“2G”を、”100m”に変更したら取得できるようになりました。
Gという単位が使えないのか、もしくはwin32バージョンだからなのか…
理由までは追いませんでしたが。

これでなんとか動作させることが出来、
5.3以上のありがたみを改めて実感したところです。


Leave a comment