Joomla! を PHP 7 系へ上げたときのエラーと対処(2019年の記録)

私が2019年にJoomla!をPHP 7系へ上げた際のエラーメモに、2021年の表示不具合とDB接続の記録をまとめました。2026年11月に、古い対処と現在使える説明を分けて見直しました。

PHP 5.6と7系はサポート終了済みです。Joomla! 2.5に加え、3系も公式サポートを終了しています。今から使う人には、対応する拡張機能とテンプレートを確認したうえで、サポート中のJoomla!・PHPへの移行を勧めます。以下のコードは旧環境での記録で、現在の本番環境への一括適用を想定していません。

PHPの終了版一覧、Joomla! 2.5の公式案内、Joomla! 3の公式案内、Joomla!の現行ロードマップを参照しています。

count(): Parameter must be an array or an object that implements Countable

2019年7月、PHP 7.3へ変更した際にmod_mb2portfolioのcount()で警告が出ました。元のエラー文を残します。

Warning: count(): Parameter must be an array or an object that implements Countable in 〇〇/〇〇/〇〇/modules/mod_mb2portfolio/tmpl/default.php on line 51

変更前のコードです。比較式をcount()へ渡していました。

if (count($items>0)){

当時は次のように直しました。ただし、isset()だけでは配列やCountableであることを確認できません。これは修正途中の記録です。

if(isset($items) and count($items) > 0){

見直し後の条件式は次の形です。is_countable()はPHP 7.3以降で使えますが、PHP 7.3自体の利用を勧める意味ではありません。

if (isset($items) && is_countable($items) && count($items) > 0) {
    // 配列または Countable の要素がある場合の処理
}

PHP 7.2からcount()の引数が非対応型なら警告が出ます。PHP 8ではTypeErrorになります。元々配列が入る設計なら、条件式で避けるだけでなく、$itemsの取得元も調べます。count()の公式説明とis_countable()の公式説明が根拠です。

basemenu.php:”continue” targeting switch is equivalent to “break”

2019年7月、PHP 7.3へ変更した際の警告です。対象はlibraries/expose/core/menu/basemenu.phpでした。

Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? in /www/◯◯◯/libraries/expose/core/menu/basemenu.php on line 178

私が当時行った変更は次のとおりです。

#178 continue; を break; に変更しました。

switchを抜ける意図ならbreakを使います。switchの外側にあるループの次の反復へ進む意図ならcontinue 2です。一般のループでbreakとcontinueが同じ意味になるわけではありません。元の処理の意図を確かめて選びます。現行環境でこのExposeの版が使えるかは未確認なので、フレームワークの更新・置換も確認します。PHPのcontinueの説明を参照してください。

Fatal error: Redefinition of parameter $recipient

2019年8月、ExtraWatchのインターフェースと実装側でエラーが出ました。元の記事に残した2つの表示です。2つ目は記録自体が短く、ここにないエラー文を補ってはいません。

Fatal error: Redefinition of parameter $recipient in /◯◯◯/components/com_extrawatch/src/env/interface.extrawatch.env.php on line 49

Fatal error: /◯◯◯/components/com_extrawatch/src/env/joomla/class.extrawatch.env.joomla.php  on line 122

PHP 7以降、同じ仮引数名を重複して宣言できません。先に拡張機能の対応版への更新や置換を確認します。以下は当時の暫定対応です。

重複する仮引数名を修正する(過去の暫定対応)

変更前です。

public function sendMail($recipient, $sender, $recipient, $subject, $body, $true, $cc, $bcc, $attachment, $replyto, $replytoname);

当時の変更後です。

public function sendMail($recipient, $sender, $recipient_1, $subject, $body, $true, $cc, $bcc, $attachment, $replyto, $replytoname);

変えたのは関数名sendMailではなく、重複する仮引数名です。インターフェースの一行だけを変えればよいとは限りません。実装との整合を確認します。元の記事には「Extensions → Modules (Site) → ExtraWatch Agent Module → OFF」という停止の記録もありますが、現在の画面と対応状況は未確認です。PHP 7の非互換変更を参照しています。

Warning: A non-numeric value encountered in

2019年8月、テンプレートの幅を計算する部分で警告が出ました。

Warning: A non-numeric value encountered in /◯◯◯/templates/theme2035/includes/includes.php on line 94

変更前です。

$mainContentWidth = 12 – ($asideLeftWidth + $asideRightWidth);

当時は左右の幅を整数へキャストしました。次のコードは、その暫定対応を残したものです。

$mainContentWidth = 12 – ((int)$asideLeftWidth + (int)$asideRightWidth);

一律に(int)を付けても値の正しさは保証できません。幅の取得元、型、許容範囲を確認します。PHP 8では数値として扱えない文字列の算術がTypeErrorになるため、警告だけを消す対処として使わないようにしました。PHP 8の非互換変更を参照しています。

You are not permitted to use that link to directly access that page (#4).

ここからは2021年6月の別の記録です。Joomla! 2.5で、ページを開くときとログイン後にページを選ぶときに、同じ案内が出ました。

You are not permitted to use that link to directly access that page (#4).

当時の私は、サーバーのPHPが5.2から7.1へ変更されていたと記録しています。PHPを5.6へ戻したあとに表示できましたが、変更履歴と症状の因果関係は外部資料では未確認です。同じ案内が出るすべての環境に、この原因を当てはめることはできません。

この切替は旧環境の一時復旧の記録です。現在はPHP 5.6へのダウングレードを解決策として勧めません。対応するテンプレートと拡張機能を選び、サポート中の環境へ移す方針で見直します。下の画像は症状と当時の管理画面を残したものです。

You are not permitted to use that link to directly access that page (#4).。画面は2021年当時のものです。
You are not permitted to use that link to directly access that page (#4).。画面は2021年当時のものです。
画面は2021年当時のものです。
画面は2021年当時のものです。
画面は2021年当時のものです。

Database connection error (2): Could not connect to MySQL.

こちらは2021年11月のDBへ接続できなかったときの記録です。DB接続エラーを調べる途中で、phpMyAdminの簡単インストールがPHPの要件で止まりました。元のエラーは「Database connection error (2): Could not connect to MySQL.」です。

phpMyAdminの簡単インストールができない

PHP 7.1.3+ is required.

Currently installed version is: 5.6.40

表示されていたのは「PHP 7.1.3+ is required. Currently installed version is: 5.6.40」です。これは当時のインストーラーの要件で、現在のphpMyAdminの要件ではありません。

当時はPHP 7.1へ切り替えてインストールできたと記録しました。一方でJoomla!のテンプレートがPHP 7に対応していない問題も残っていました。管理ツールをインストールできたことと、CMSの互換性やDB接続の問題を解決できたことは分けて考えます。

プログラミング言語バージョン切り替え画面。画面は2021年当時のものです。
画面は2021年当時のものです。

今は、CMS・テンプレート・DB接続設定を検証し、サポート中のPHPへ移行する前提で調べます。導入するphpMyAdminの要件は公式配布先で版ごとに確認します。この記事では現在の必要バージョンを未確認のまま書き足していません。

この記事を書いた人

山崎 大祐

大阪出身。千葉県松戸市在住。2児の父です。WordPressの構築を60サイト超えました。営業経験を生かしたSEMを得意としております。(企画/デザイン/構築/運営)
すきなもの「赤色・キューブ・コンクリート」