Warning: Cannot use a scalar value as an array in ...
變數已被定義為純量型別 (int/float/string/bool/null),後續卻嘗試以陣列語法存取 (如 $var[0] = ...)。
<?php
$i = 1000; // $i 是 integer
$i[5] = 345; // ❌ 錯誤:純量不能當陣列用
$flag = true; // boolean
$flag['key'] = 'val'; // ❌ 同上
$str = 'hello';
$str[0] = 'H'; // ✅ 字串可用陣列語法修改單一字元 (但不可新增超出長度索引)
?>
| 原型別 | 可轉為 | 不可轉為 |
|---|---|---|
| int/float/bool/string | 互相轉換、object | array |
| array (一維) | object | 多維陣列 (需先建立子陣列) |
| null | array (自動建立) | - |
<?php
// 錯誤
$count = 0;
foreach ($items as $item) {
$count[$item['id']] = 1; // $count 是 int
}
// 正確
$count = [];
foreach ($items as $item) {
$count[$item['id']] = 1;
}
?>
<?php
function getData() {
if ($empty) return 0; // 回傳 int
return ['a', 'b'];
}
$data = getData();
$data[] = 'c'; // ❌ 若 $empty=true 會報錯
// 修正:統一回傳陣列
function getData() {
if ($empty) return [];
return ['a', 'b'];
}
?>
<?php
$str = 'abc';
$str[5] = 'x'; // ❌ 字串不可擴展長度
// 正確:轉陣列操作
$arr = str_split($str);
$arr[5] = 'x';
$str = implode('', $arr);
?>
<?php
// 遇到錯誤行前加入
var_dump($suspectVar, gettype($suspectVar));
// 確認型別是否為純量
?>
嚴格區分變數型別、避免變數重複使用不同型別、函數回傳型別一致性,即可杜絕此錯誤。PHP 8.1+ 可啟用 declare(strict_types=1) 配合型別宣告進一步防範。