「Uncaught TypeError: Unsupported operand types: string – string」は、文字列同士を「-」や「+」などの算術演算子で計算しようとしたときにPHP 8で発生するエラーです。
PHP 7までは文字列でも自動的に数値へ変換されて計算が通っていましたが、PHP 8では数値として解釈できない文字列への算術演算が即Fatal errorになりました。そのため、今まで動いていたサイトがPHPのバージョンアップを境に突然このエラーで止まる、というパターンが典型です。エラーメッセージの「string – string」の部分は演算子と型の組み合わせによって「int + string」「string * int」などに変わりますが、原因は同じです。
修正方法 — 計算前に数値へキャストする
フォームの入力値やデータベースから取得した値は、内容が数字でも型としては文字列で渡ってくることが多くあります。計算に使う前に(int)や(float)でキャストしてください。
// エラーになる例(両方とも文字列) $total = $a - $b; // 修正例 $total = (int)$a - (int)$b;
同種のエラーがサイト内の他の箇所にも潜んでいることが多いため、1箇所直して終わりにせず、エラーログを確認しながら順に潰していくことになります。
EC-CUBE2系での実例
EC-CUBE2系(PHP 8で稼働させている環境)で受注明細を追加しようとした際に、実際にこのエラーが発生しました。
[/admin/order/edit.php] Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: string - string in /var/www/app/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php:745
Stack trace:
#0 /var/www/app/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php(270): LC_Page_Admin_Order_Edit->lfCheckError(Object(SC_FormParam))
#1 /var/www/app/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php(146): LC_Page_Admin_Order_Edit->action()
#2 /var/www/app/html/admin/order/edit.php(28): LC_Page_Admin_Order_Edit->process()
#3 {main}
thrown on [/var/www/app/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php(745)] from 172.28.0.1
エラーが出た該当の部分は、
// 最終保持ポイント
$arrValues['total_point'] = $objFormParam->getValue('point') - $arrValues['use_point'];
というコードで、ポイント数の変数が文字列のまま引き算されているために発生していました。次のようにキャストして解消しています。
$arrValues['total_point'] = (int)$objFormParam->getValue('point') - (int)$arrValues['use_point'];
EC-CUBE2系はPHP 8を公式にサポートしていないため、PHP 8系のサーバーで動かしている場合はこの種の修正が各所で必要になります。同様のエラーが頻発する場合は、バージョンアップの検討をおすすめします。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。
EC-CUBEゴールドパートナー