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 = []と定義するか、関数の戻り値に型宣言を活用して、予期せぬスカラー値が混入しない設計を心がけましょう。



関連記事