ページへ戻る

− Links

 印刷 

XCL (XOOPS Cube Legacy) の PHP 5.6 対応 :: XOOPS マニア

UsersWiki:nao-pon/blog/2015-04-15


RSS of nao-pon/blog[5]
2015 4月 15 (水)
 

XCL (XOOPS[6] Cube Legacy) の PHP 5.6 対応 anchor.png[7]

Tag: XCL[8] XOOPS[9] XOOPS X[10] PHP[11] PHP 5.6[12] プログラミング[13]

logo-php56.png[14]

Raspberry Pi 2 をウェブサーバーに仕立てて[15]、PHP 5.6 系で XOOPS[6] X を動かしてみると、大量の "Unknown Condition [8192]: Non-static method 〜" というエラーが表示されます。*1

「ん〜これは修正したい!」という欲望に駆られて着手してしまいました。 :-D

まずは、コアと XOOPS[6] X でメンテナンスしているモジュールから手を付けます。

一番多いエラーは、MyTextSanitizer[16]::getInstance() のエラーです。

MyTextSanitizer[16] クラスの 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[16]::getInstance() に static キーワードを付ければいいのですが、MyTextSanitizer[16] クラスはモジュール側で継承クラスを持っていることが多く、安易に static キーワードを付けてしまうと Fatal エラーになってしまいます。

そこで、新しく static なメソッド sGgetInstance() を作って対応することにしました。

モジュール側では、

$ts =& MyTextSanitizer[16]::getInstance();

としているところを

(method_exists('MyTextSanitizer[16]', 'sGetInstance') and $ts =& MyTextSanitizer[16]::sGetInstance()) || $ts =& MyTextSanitizer[16]::getInstance();

などとします。

正規表現で置換するなら

(\$[\w>-]+)\s*=(\s*&)?\s*MyTextSanitizer[16]\s*::\s*getInstance\s*\(\s*\)

(method_exists('MyTextSanitizer[16]', 'sGetInstance') and $1 =$2 MyTextSanitizer[16]::sGetInstance()) || $0

に置換するとよいと思います。

これらの一連の修正を、コアに関しては XOOPS[6] X の pilot ブランチ、そして XOOPS[6] X リポジトリのモジュールに対して行いました。ただ、まだまだ修正漏れやその他のエラーが表示されますので引き続きひまひまに作業していきます。

X-update[17] で更新できます*3ので、テスト環境をお持ちの方は、ぜひ問題点をレポートして頂けると助かります。



*1 PHPデバグをOnにした場合
*2 XCL の PHPデバグでのエラーレポートレベルは "error_reporting(E_ALL ^ E_STRICT)"
*3 pilot ブランチは、正式リリースの前に評価して頂くことを目的にしたブランチで、X-update の一般設定「非表示ストア(開発・先行版)も表示する」を「はい」にすることで表示される「For developer」モジュールストアに含まれています。

Last-modified: 2015-04-15 (水) 10:59:59 (JST) (3300d) by nao-pon