获取非对象的'charge'属性报错,求排查Blade模板代码问题
报错分析:Trying to get property 'charge' of non-object
报错原因
你的Blade模板代码里,{{getAmount($data ?? ''->charge)}}这一行存在运算符优先级问题:
- 空合并运算符
??的优先级低于对象访问符->,代码实际执行顺序是$data ?? (''->charge),空字符串''不是对象,尝试访问它的charge属性就会触发这个错误。 - 即便
$data为null,??返回空字符串后,依然会执行->charge的访问操作,这必然会报错。
解决办法
根据你的PHP版本,选择以下任意一种修正方式:
方式1:使用可选链式调用(PHP 7.4+ 支持)
用?->替代直接的->,配合??给默认值,确保$data不存在时不会触发属性访问:
<td>{{ getAmount($data?->charge ?? '') }} @lang($basic->currency)</td> <td>@lang($transaction->remarks)</td> <td>{{ dateTime($transaction->created_at, 'd M Y h:i A') }}</td>
$data?->charge会在$data为null或非对象时直接返回null,再通过?? ''将null转为空字符串,避免getAmount函数接收非法值。
方式2:明确括号优先级
如果项目PHP版本较低,不支持可选链式调用,可通过括号强制先执行空合并判断:
<td>{{ getAmount(($data ?? null)->charge ?? '') }}</td> <td>@lang($transaction->remarks)</td> <td>{{ dateTime($transaction->created_at, 'd M Y h:i A') }}</td>
先通过($data ?? null)确保得到对象或null,再访问charge属性,最后用?? ''处理属性不存在的情况。
方式3:传统条件判断
最兼容的写法,适合所有PHP版本:
<td>{{ getAmount(isset($data) ? $data->charge : '') }} @lang($basic->currency)</td> <td>@lang($transaction->remarks)</td> <td>{{ dateTime($transaction->created_at, 'd M Y h:i A') }}</td>
先判断$data是否存在,存在则取charge属性,否则传空字符串。
内容的提问来源于stack exchange,提问作者Zacharia Stephano
相关产品推荐
相关产品推荐

