概要
どのサイトでもそうですが避けられないのがミドルウェアのEOL対応です。
それに伴いEC-CUBE2系サイトもPHPなどのバージョンアップ対応が必要です。PHP8対応の前にEC-CUBE4系へのリニューアルを検討されることも多いと思いますが、そうできない場合はPHP8への対応を行うことになります。
EC-CUBE2系では、2.25.0がPHP8.4に対応したバージョンとしてありますが、それを用いて基盤部分は更新できてもカスタマイズ部分は個別対応が必要です。
PHP8対応ではstaticの厳格化、==の動作の変更などこれまで通用してきた記述が不具合になるなどハードルが高いと感じます。
それでEC-CUBE2系サイトのPHP8対応を行ったことの中から修正した内容を記載します。全てが実用的というわけではありませんが、ご参考にしていただけたらと思います。
対象や内容について
※ この記事は、EC-CUBE2系をご存じの方で、PHP8での変更点は別途調査できる方を対象としています。
※ そのためエラーの原因などの説明点は省き、事例ベースの内容になっています。
※ PHP8対応でお困りの方は
ご相談ください。
以下より実際に行った対応を記載します。
staticメソッドの見直し
【対応理由】非staticメソッドがstaticメソッドとして呼び出せなくなったことへの対応
曖昧な呼び出しを利用した箇所が多く、広範囲に修正が必要でした。
【例】SC_Helper_DB_Ex
以下のような呼び出しがあります。
・非static
$objDb = new SC_Helper_DB_Ex();
$objDb->sfGetBasisData();
・static
SC_Helper_DB_Ex::sfGetBasisData();
・staticを記載していない場合は以下のエラーになります。
Fatal error(E_ERROR): Uncaught Error: Non-static method SC_Helper_DB::sfGetBasisData() cannot be called statically in
【調整内容】既存の関数を staticへ / オブジェクト呼び出しへ のどちらかに統一する
以下を判断基準にしました。
・使用頻度
・class内のプロパティやメソッドを呼んでいるかどうか
PHP標準関数のパラメータの変更対応
【対応理由】標準関数のパラメータに不正な型の変数を渡すとシステムエラーになる変更への対応
パラメータにnullが許容されなくなったり、型が異なるとエラーになったりするようになりました。
例)count、preg_replace、mb_strlen、str_pad…
【例】count
引数の$valueがCountableやarrayとなり、nullは許容されなくなりました。
nullを入れると以下のエラーになります。
Fatal error(E_ERROR): Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in
【対応方針】拡張メソッド作成
以下を考慮し標準関数拡張クラスおよびメソッドを作成することにしました。
・プログラムの可読性の維持:事前判定を加えると可読性が悪くなる
・時間的要素:全ての処理を見直して修正するには時間がかかる
【拡張メソッドの内容】
・PHP8以前と動作を同じになるようにする
→nullや型チェックの後に動作が同じになる値を返す
・拡張メソッド名:同名+_ex
→grep検索で未対応と対応分の区別をつけ、置換漏れを防ぐため
==の動作の変更対応
【対応理由】==での文字列と数値の比較の変更対応
これまでは数値ではない値を数値に変換して比較しているような挙動でしたが
数値を文字に変換して比較するようになりました。
そのため、if文の判定が逆になるなど挙動が意図通りにならないケースが出てきました。
【例】0 == ""がfalseになる
※ その他の具体例はPHP公式の「PHP 7.4.x から PHP 8.0.x への移行」の「下位互換性のない変更点」をご覧ください
【調整内容】PHP8より前の==と同じ挙動をする関数を作成して対応
・数値ではない値を数値変換して比較する関数を作成
→PHP7、8で動作を確認し、問題ないことを確認する
・==や!=を置き換え
→単純な置換ではないので、正規表現を用いて置換する
Next
PHP8対応でお困りの方へ