
当使用$evaluationjob["element_degree"]访问数据库查询结果时,若$evaluationjob为null(即未查到记录),php 7.4+会抛出“trying to access array offset on value of type null”错误;需先判空再取值。
该错误源于 PHP 严格类型检查机制的增强:从 PHP 7.4 开始,对 null 值执行数组下标访问(如 $var['key'])将直接触发致命错误,而非静默返回 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,则报错->first() 方法在未找到记录时返回 null,此时 $evaluationjob["element_degree"] 等价于 null["element_degree"],违反语言规范。
✅ 正确做法是双重防护:
立即学习“PHP免费学习笔记(深入)”;
- 确保 $evaluationjob 非空(非 null);
- 确保其确实包含 element_degree 字段(避免字段缺失或为 null)。
推荐写法(兼顾健壮性与可读性):
$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)) {
$items = json_decode($evaluationjob->element_degree, true); // true → 返回关联数组,更安全
} else {
$items = []; // 或 throw new InvalidArgumentException('Missing or invalid element_degree');
}⚠️ 注意事项:
- 使用对象属性访问($evaluationjob->element_degree)比数组下标($evaluationjob["element_degree"])更符合 Eloquent 模型惯例;
- json_decode() 应配合 is_string() 校验,防止传入 null 或非字符串导致返回 null 而不报错;
- 若需默认值,可结合 Null Coalescing Operator(PHP 7.0+):
$jsonStr = $evaluationjob?->element_degree ?? ''; $items = is_string($jsonStr) ? json_decode($jsonStr, true) : [];
总结:始终假设数据库查询可能失败,在访问模型属性或 JSON 字段前进行显式判空与类型校验,是编写健壮 PHP 应用的基本原则。











