blogPHPでWEB+DBシステムの開発をやっています。年内のPHP4サポート終了に向けて、PHP5への移行が進む昨今です。PHP5で推奨されていないスクリプトをチェックするのがE_STRICTです。E_STRICTが有効なのは分かっていたのですが、実際にどんなスクリプトがE_STRICTに引っかかるのかが、あやふやでした。そこでE_STRICTで出力されるメッセージをPHPのソースから抜き出してみました。どのようなスクリプトがE_STRICTに引っかかるのか(引っかからないか)のヒントになればと思います。ちなみにE_STRICTの活用方法としてマニュアルには[-l]オプションによるチェックが書かれていますが、スクリプトを実行しないと発生しないE_STRICTもあるので、実際には実行して確認する方が良いです。staticインスタンス変数をクラス変数としてアクセスしている。クラス変数としてアクセスするなら宣言時にstaticを付けます。property」が発生しました。deprecatednew演算子の戻り値を参照で受け取ろうとする。PHP5では[=]で参照渡しとなるのでインスタンス化したオブジェクトを[=&]で受け取る必要はありません。value空の値からデフォルトオブジェクトを作ろうとしている。未定義のインスタンス変数をオブジェクトと見なして、さらに->でそのインスタンス変数を参照しようとすると発生します。分かりにくいので↓ソースです。%s::%s()継承によりメソッドをオーバーライドする場合は、継承元と同じメソッド定義にする。deprecated関数XXXは非推奨。ソースをgrepした中ではdl()が非推奨となっていました。‘zend.ze1_compatibility_mode’zend.ze1_compatibility_mode=on設定時のみ発生。オブジェクトを参照するとひたすら発生しました。zend.ze1_compatibility_mode=onにする時はE_STRICTは切った方が吉です。statically1.のメソッド版。クラスメソッドとして呼ぶなら、メソッド定義時にstaticを付ける。似たメッセージとして以下のようなものがあります。referenceメソッドの戻り値を[=&]で受け取ろうとすると発生。[=]で受け取ればokです。似たメッセージとして以下のようなものがあります。%sPHP4版コンストラクタ(クラス名と同じメソッド)とPHP5版コンストラクタ(__construct)が定義されている。できればコンストラクタは__constructにします。PHP4のソースをそのまま使用するなら__constructを記述しないようにします。(%ld)リソースIDを連想配列のインデックスとして使用すると発生します。実際のシステムで発生するシチュエーションが良く分からないのですが、以下のソースでは確かに発生します。abstractクラスメソッドはabstractにしない。クラスメソッドにしたところでabstractだと呼びようがありません。6{}による文字列へのアクセスはPHP6で消えるので非推奨です。マニュアルでは[]でのアクセスを推奨しています。0_ilia」となっているので、通常のbuildでは表示されません。operatoris_a()は非推奨。代わりにinstanceofを使います。...タイムゾーンの明示的な設定をせよ。デフォルトセッティングをあてにしてはいけない。全文は以下な感じです。環境変数で設定するか、date_default_timezone_set(‘Asia/Tokyo’)で設定しておけばokです。これからはE_STRICT対応で?以前はvarでインスタンス変数を定義しただけでE_STRICTが発生していたため、PHP4のソースを移行する際は正直あまり使っていませんでした。5.1.3でこの処理は削除されていますので、PHP4なソースでも使ってみようと思います。PHP5で動作しているPHP4なソースをE_ALL|E_STRICTで実行してみると7.関連でエラーが多数出てきました。うーん、これ全部直すのか。同じ資料を業務で作りました。parserでやってるやつとそうでないやつがあるんですよね。これだとエラーメッセージレベルなのでメッセージ次第なんですよねー。同じ資料を業務で作りました。あちこちで作ってそうですね。;-)gophp5な情報は皆で共有したいですよね。parserでやってるやつとそうでないやつがあるんですよね。E_STRICT出ないのでも、挙動が代わってる箇所があるので(オブジェクト参照とか)結局は実行しながら修正して行くんですけどね。new演算子の戻り値を参照で受け取ろうとする。PHP5では[=]で参照渡しとなるのでインスタンス化したオブジェクトを[=&]で受け取る必要はありません。E_STRICTを防ごうとするのはもっと大変です。E_STRICTで表示されるエラーメッセージを調べてみた」に詳しいのですが、代表的なのはstatic修飾子がついてないメソッドを静的にコールしたり、PHP4形式のコンストラクタとPHP5形式のコンストラクタの両方が宣言されていたりというものです。これらはPHP4の上でもPHP5の上でも動くスクリプトを書こうとすると避けることが出来ません。E_STRICTが出ないコードを書こうとするとPHP5の上でしか動かないスクリプトになってしまいます。CakePHPを含む多くのPHPフレームワークはPHP4とPHP5の両方で動くように作られている為、これらのフレームワークを使うと大量のE_STRICTが出ます。