
当使用`$array["key"]`语法访问数据库查询结果时,若查询未返回数据(即变量为`null`),直接访问其键会触发“trying to access array offset on value of type null”错误;需先校验变量存在性与键有效性。
该错误本质是 PHP 8.0+ 引入的严格类型安全机制:对 null 值执行数组下标访问(如 $evaluationjob["element_degree"])将直接抛出致命错误,而非静默返回 null 或警告。
在您的代码中:
$evaluationjob = evaluation_elements_jobs::where('job_id', $user->job_id)
->where('company_id', $company_check->id)
->first(); // 可能返回 null(无匹配记录)
$items = json_decode($evaluationjob["element_degree"]); // ❌ 若 $evaluationjob 为 null,此处崩溃正确做法是分层防御性检查:
- 确认模型实例非 null:first() 在无结果时返回 null,不可直接当作数组/对象使用;
- 确认字段存在且非空:即使模型存在,element_degree 字段也可能为 null、空字符串或缺失;
- 安全解码 JSON:json_decode() 应配合 json_last_error() 或空值判断,避免解析失败导致 $items 为 null。
✅ 推荐写法(兼顾可读性与健壮性):
立即学习“PHP免费学习笔记(深入)”;
$evaluationjob = evaluation_elements_jobs::where('job_id', $user->job_id)
->where('company_id', $company_check->id)
->first();
if ($evaluationjob && isset($evaluationjob->element_degree) && is_string($evaluationjob->element_degree)) {
$decoded = json_decode($evaluationjob->element_degree, true);
if (json_last_error() === JSON_ERROR_NONE) {
$items = $decoded;
} else {
\Log::warning('Invalid JSON in element_degree', [
'job_id' => $user->job_id,
'raw' => $evaluationjob->element_degree
]);
$items = [];
}
} else {
$items = []; // 默认空数组,避免后续逻辑报错
}⚠️ 注意事项:
- 使用 $evaluationjob->element_degree(Eloquent 属性访问)比 $evaluationjob["element_degree"] 更符合 Laravel 惯例,也更安全(自动处理属性不存在时的 __get 代理);
- 若必须用数组语法(如从 toArray() 转换后),请确保 $evaluationjob 是数组且已初始化:is_array($evaluationjob) && array_key_exists('element_degree', $evaluationjob);
- 在开发环境开启 error_reporting(E_ALL) 和 display_errors=On,便于及时捕获此类类型错误;
- 生产环境建议统一封装 JSON 解析工具函数,复用错误处理逻辑。
总结:永远不要假设数据库查询必然返回数据或字段必然有值。添加 null 检查、字段存在性验证和 JSON 解析容错,是编写高稳定性 PHP 应用的基本准则。











