Raspberry Pi 2 をウェブサーバーに仕立てて、PHP 5.6 系で XOOPS X を動かしてみると、大量の "Unknown Condition [8192]: Non-static method 〜" というエラーが表示されます。*1
「ん〜これは修正したい!」という欲望に駆られて着手してしまいました。
まずは、コアと XOOPS X でメンテナンスしているモジュールから手を付けます。
一番多いエラーは、MyTextSanitizer::getInstance() のエラーです。
MyTextSanitizer クラスの getInstance() に static キーワードが付いていないのに、静的に呼び出しているのが原因です。PHP 5.6 以前は、E_STRICT エラーだったものが、5.6 以降は E_DEPRECATED エラーとして出力されるようになったので、5.6 以降の環境では、大量にエラーレポートされるようになったわけです。*2
当初は、"error_reporting(E_ALL ^ E_STRICT ^ E_DEPRECATED)" にしてしまおうと思いましたが、E_DEPRECATED を隠してしまうと、将来サポートされなくなる問題点がわかりづらくなってしまうので、error_reporting はそのままにして、コード修正を行うことにしました。
本来なら MyTextSanitizer::getInstance() に static キーワードを付ければいいのですが、MyTextSanitizer クラスはモジュール側で継承クラスを持っていることが多く、安易に static キーワードを付けてしまうと Fatal エラーになってしまいます。
そこで、新しく static なメソッド sGgetInstance() を作って対応することにしました。
モジュール側では、
$ts =& MyTextSanitizer::getInstance();
としているところを
(method_exists('MyTextSanitizer', 'sGetInstance') and $ts =& MyTextSanitizer::sGetInstance()) || $ts =& MyTextSanitizer::getInstance();
などとします。
正規表現で置換するなら
(\$[\w>-]+)\s*=(\s*&)?\s*MyTextSanitizer\s*::\s*getInstance\s*\(\s*\)
を
(method_exists('MyTextSanitizer', 'sGetInstance') and $1 =$2 MyTextSanitizer::sGetInstance()) || $0
に置換するとよいと思います。
これらの一連の修正を、コアに関しては XOOPS X の pilot ブランチ、そして XOOPS X リポジトリのモジュールに対して行いました。ただ、まだまだ修正漏れやその他のエラーが表示されますので引き続きひまひまに作業していきます。
X-update で更新できます*3ので、テスト環境をお持ちの方は、ぜひ問題点をレポートして頂けると助かります。
ぺージ情報 | |
---|---|
ぺージ名 : | nao-pon/blog/2015-04-15 |
ページ別名 : | 未設定 |
ページオーナー : | nao-pon |
閲覧可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |
編集可 | |
グループ : | なし |
ユーザー : | ゲスト |