PHPの開発中に「Uncaught Error: Cannot use a scalar value as an array in…」というエラーに直面することがあります。 このエラーは、PHP 8.0以降の型チェック厳格化に伴い、古いコードを動かした際などに特によく見られるようになりました。原因と具体的な解決法を解説します。
エラーが起きる原因
このエラーは、すでにスカラー値が代入されている変数に対して、配列のように要素を追加しようとしたときに発生します。
スカラー値とは? 単一の値を表すデータの型のこと。PHPでは「整数(int)」「浮動小数点数(float)」「文字列(string)」「論理値(bool)」を指します。
エラーになるコードの例
$data = 10;
$data[] = "新しく追加したい要素";
この場合、変数$dataは配列ではないため[]を使った追加操作(Auto-vivificationの失敗)を受け付けません。
基本的な解決策:変数の初期化
最も単純かつ確実な解決策は、配列として使う前に**空の配列で変数を初期化(リセット)**することです。
$data = 10;
// 配列として使いたいタイミングで再定義
$data = [];
$data[] = "要素1";
$data[] = "要素2";
var_dump($data);
このように$data = [];と明示的に宣言し直すことで、以前のデータが破棄され、安全に配列として扱えるようになります。
実務でよくある発生パターンと対策
実際の開発では、明示的に数値を代入していなくてもこのエラーに遭遇することがあります。
外部データの取得失敗
APIやデータベースから値を取得した際、正常なら配列が返ってくるはずが、エラーでfalseやエラーコード(数値)が返ってきた場合に発生します。
対策:型を確認してから操作する
if (!is_array($data)) {
$data = [];
}
$data[] = "追加データ";
ループ内での変数名の重複
同じ変数名を使い回していると、意図せず前の処理で入れたスカラー値が残っていることがあります。
対策:ループの直前で初期化を徹底する
$items = [1, 2, 3];
$result = "成功";
$result = [];
foreach ($items as $item) {
$result[] = $item * 2;
}
PHPバージョンによる挙動の違い
以前のPHP(7.4以前)では、変数がnullの場合に[]で値を追加すると自動的に配列として扱われましたが、PHP8.0以降では型チェックが厳格化されています。 以前動いていたコードが、サーバーのバージョンを上げたら動かなくなったという場合は、この厳格化が原因である可能性が高いです。常に「配列を使う前は初期化する」という癖をつけておきましょう。
この記事のまとめ
「Cannot use a scalar value as an array」を防ぐには、**「配列を使う直前で必ず初期化する」**という習慣が重要です。
モダンなPHP開発においては、最初から$data = []と定義するか、関数の戻り値に型宣言を活用して、予期せぬスカラー値が混入しない設計を心がけましょう。