概要
前回はPHP8対応のstaticや標準関数、等価比較の変更について記載しました。
このページでは、わかりにくい挙動の変更とその他の修正について取り上げます。
※ PHP8対応でお困りの方は
ご相談ください。
配列のKeyの動作変更対応
【対応理由】配列のKey(数値)に対して文字列で先頭0がついた数字を入れるとヒットしなくなる部分の対応
【簡単な例】
例)Keyが5の場合に05でアクセスする
$month = [5=>"5", 6=>"6"];
$key = "05";
echo $month[$key];
以下のWarningになります。
Warning(E_WARNING): Undefined array key "05" on
PHP8より前の場合、5が出力されますが、PHP8からは存在しないという判定になります。
【EC-CUBE2系を使った簡易例】
EC-CUBE2系では日付の月や日のセレクトボックス用のは配列の参照で起こる可能性があります。
$date = new SC_Date_Ex();
$arrMonth = $date->getMonth(); // 数値をキーとした配列が作成される
$nowDate = explode('-', date('Y-m-d')); // 例えば2026-01-05
$m = $nowDate[1]; // 01が変数に入る
echo $arrMonth[$m]; // PHP7までは1が取り出せ、PHP8ではnullとなる
上記の場合、10月未満はヒットしなくなります。
日付をDB登録しているものについてはこの呼び出しとなるため確認が必要です。
【調整内容】Keyへのアクセス変数をint変換するか、配列側のKeyに0を含めた2桁にするかの対応を行う
上記の例では以下のどちらかを行います。
・explode('-', date('Y-m-d'))で取得した値をint変換かける
・$date->getMonth()ではなく$date->getZeroMonth()を用いる
空文字を使った演算への対応
【対応理由】変数の中身が空文字でも演算が可能だったが、システムエラーになったため
【例1】文字に数値を加算して数値変換していた箇所
これまでは
$value + 0で$valueが空文字の場合は0に変換されていたため数値変換をこういった形で行っている箇所がありました。
エラーとなったため
intvalなどを使った数値変換に変更する必要があります。
エラーの内容
Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: string + int in
【例2】空文字の変数同士を演算している箇所
中身がない場合や初期値で空文字を入れておき、
$value1 + $value2でどちらも空文字であっても演算できていました。
こちらもエラーになったため数値変換したり、初期値を入れたり、空文字を代入した部分を0に変更したりする必要があります。
エラーの内容
Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: string + string in
その他のPHP8対応
PHP8対応や過去バージョンからの対応が残っていた部分を修正
・配列の{}を[]へ変更
・splitをexplodeへ変更
・create_functionを無名関数へ変更
・文字内での変数の参照${value}→{$value}へ
・新しいオブジェクトを参照渡しで代入できない部分の修正
→例)$this->value =& new classA;→$this->value = new classA;
・eachをforeachなど状況に合わせて対処
Next
PHP8対応でお困りの方へ