【PHP実践|実務向け】PHP 7.2以降で頻出する「count(): Parameter must be an array or an object that implements Countable」エラーの正しい対処法

1. 導入

PHPの開発現場で、突如として画面やログに「Warning: count(): Parameter must be an array or an object…」というエラーが表示された経験はありませんか?これはPHP 7.2へのバージョンアップに伴い、厳格化された型チェックによって引き起こされる典型的な警告です。放置すると予期せぬバグや表示崩れの原因となるため、確実な修正方法を身につけることが重要です。

2. 基礎知識

PHP 7.2以前では、count()関数にnullや数値などを渡すと、自動的に「0」として扱われていました。しかし、PHP 7.2以降では「配列またはCountableインターフェースを実装したオブジェクト」以外を渡すと、Warningが発生する仕様に変更されました。これはコードの堅牢性を高めるための変更ですが、古いライブラリやレガシーなコードベースでは頻出するエラーとなっています。

3. 実装/解決策

解決策は非常にシンプルです。count()を呼び出す前に、対象の変数が配列であるか、あるいはCountableインターフェースを実装しているかを確認する、もしくは型を強制的に変換(キャスト)することです。現場では、可読性と安全性を考慮して「is_array」によるチェックを行うのが最も推奨される手法です。

4. サンプルプログラム

以下は、エラーを回避するための安全な実装例です。

  • 安全に配列の要素数を取得する関数例
  • /
    function getSafeCount($data) {
    // 1. 配列であるか確認してからcountする(最も推奨される方法)
    if (is_array($data) || $data instanceof Countable) {
    return count($data);
    }

    // 2. 配列でない場合は0を返す
    return 0;
    }

    // 動作確認用データ
    $nullData = null;
    $arrayData = [‘PHP’, ‘Archive’, ‘Tips’];

    // 修正前(エラーが発生する例)
    // echo count($nullData);

    // 修正後(安全なコード)
    echo “配列の要素数: ” . getSafeCount($arrayData) . PHP_EOL; // 出力: 3
    echo “nullの場合の要素数: ” . getSafeCount($nullData) . PHP_EOL; // 出力: 0
    ?>

    5. 応用・注意点

    現場での対応において、以下の点に注意してください。

    ・三項演算子での短縮記法
    小規模な修正であれば、以下のように記述することも可能です。
    $count = is_array($data) ? count($data) : 0;
    ただし、複雑な条件式の中に埋め込むと可読性が下がるため、関数化して共通化することをおすすめします。

    ・外部ライブラリの場合
    参考本文のように、WordPressのプラグインなど「他人が書いたコード」でエラーが発生している場合は、安易にライブラリを直接書き換えてはいけません。アップデートで修正されるのを待つか、どうしても修正が必要な場合は、Git等で管理した上でパッチを当てる、あるいは別の代替プラグインを検討するのがエンジニアとしての正しいリスク管理です。

    ・論理的な誤りに注意
    単にエラーを消すために「(array)$data」のようにキャストしてcount()を通す手法もありますが、nullを空配列[]に変換するとcountは0を返します。しかし、本来処理すべきだったデータが消失している可能性もあるため、単にエラーを消すだけでなく「なぜnullが渡ってきたのか」という根本的なロジックの不備を追跡することが、現場での技術力向上に繋がります。

    タイトルとURLをコピーしました