PHP遍历数据写入Excel时报Trying to get property 'full_name' of non-object错误
问题原因排查
- 你给出的示例数据结构是正常的,但实际运行时
$data数据集里存在部分不符合该结构的条目,核心触发错误的场景有两类:
- 部分条目里的
coordinator或user字段值为null,并非嵌套对象:比如对应数据没有关联协调员/用户信息,数据库查询时关联字段返回空,此时直接访问->full_name属性就会抛出非对象属性访问错误。 - 部分条目里的
coordinator或user字段是数组格式而非对象:比如你用json_decode解析数据源时开启了第二个参数true,或者数据库返回结果默认是数组结构,此时用对象运算符->访问属性也会触发该错误。
解决方法
方案1:使用空安全运算符快速兼容(适配PHP 7.4及以上版本)
直接把所有嵌套属性访问的写法替换为空安全写法,即使对应字段为null也不会抛出错误,会自动返回null:
foreach ($data as $dt_row) { // 替换所有->为?->访问嵌套属性 if ($coordinator != $dt_row->coordinator?->full_name) { $sheet->setCellValue('A' . $row, "Zmiana " . $dt_row->shift_code . " - " . $dt_row->coordinator?->full_name); $sheet->setCellValue('B' . $row, $dt_row->coordinator?->position); $sheet->getStyle('A' . $row . ':B' . $row)->getFont()->setBold(true); $coordinator = $dt_row->coordinator?->full_name; $row++; } $sheet->setCellValue("A" . $row, $dt_row->user?->full_name); $sheet->setCellValue("B" . $row, $dt_row->user?->position); $row++; }
方案2:前置校验异常数据(适配所有PHP版本)
在循环开头先校验当前行的结构是否合法,同时可以打印异常数据排查数据源问题:
foreach ($data as $dt_row) { // 前置校验字段合法性 if (!is_object($dt_row->coordinator) || !is_object($dt_row->user)) { // 开发环境可以打印异常行排查问题,生产环境可以记日志跳过异常行 var_dump($dt_row); continue; } if ($coordinator != $dt_row->coordinator->full_name) { $sheet->setCellValue('A' . $row, "Zmiana " . $dt_row->shift_code . " - " . $dt_row->coordinator->full_name); $sheet->setCellValue('B' . $row, $dt_row->coordinator->position); $sheet->getStyle('A' . $row . ':B' . $row)->getFont()->setBold(true); $coordinator = $dt_row->coordinator->full_name; $row++; } $sheet->setCellValue("A" . $row, $dt_row->user->full_name); $sheet->setCellValue("B" . $row, $dt_row->user->position); $row++; }
如果校验时发现coordinator/user是数组,把属性访问方式改为数组形式即可,比如$dt_row['coordinator']['full_name']。
内容的提问来源于stack exchange,提问作者DonVolt
相关产品推荐
相关产品推荐

