首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Warning: Cannot use a scalar value as an array 根因与修复

     編輯:PHP 綜合知識

错误现象

[27-Aug-2011 22:26:12] PHP Warning: Cannot use a scalar value as an array in /www/hx/enjoy.php on line 14

典型触发代码

$arr_hx = $mem->get('hx'); // 假设返回 false (未命中)
if (!$arr_hx) {
    $arr_hx['a'] = 'b'; // ❌ 此处报错:$arr_hx 是 bool(false),非数组
    $mem->set('hx', $arr_hx);
}

根因分析

PHP 变量一旦被赋值为标量类型(integer、float、string、bool、resource),不能直接当作数组使用(即不能用 `[]` 或 `['key']` 语法)。即使该变量之前是数组,被覆盖为标量后也会失去数组特性。

  • $mem->get() 未命中返回 false(布尔标量)
  • if (!$arr_hx) 判断为真进入分支
  • $arr_hx['a'] = 'b' 尝试以数组方式写入 → 触发 Warning

修复方案

$arr_hx = $mem->get('hx');
// 显式初始化为数组
if (!$arr_hx) {
    $arr_hx = []; // 或 array()
    $arr_hx['a'] = 'b';
    $mem->set('hx', $arr_hx);
}

或更简洁的合并写法:

$arr_hx = (array) $mem->get('hx') + ['a' => 'b']; // 强制转数组再合并
$mem->set('hx', $arr_hx);

类型转换规则补充

PHP 手册说明:标量类型可相互转换(int↔float↔string↔object),但标量不可转为数组。即使变量曾是一维数组,也不能直接转为多维数组(需显式重建)。

防御性编程建议

  1. 获取外部数据后立即类型规范化:$data = (array) $mem->get('key');
  2. 使用 null 合并运算符 (PHP 7+):$arr = $mem->get('key') ?? [];
  3. 开启错误报告:开发环境 `error_reporting(E_ALL)` 暴露 Warning,上线前清理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved