PHP出现Call to a member function format() on string报错如何解决?
报错原因
通过DB门面查询返回的started_at字段是原生字符串格式,不是可调用方法的日期对象,因此直接调用format()会抛出错误。同时原有代码的空判断逻辑顺序错误:$data->started_at->format('H:i:s') ?? ''会先执行format()方法再做空判断,字段为空时会提前触发报错。
报错修复方案
方案1:手动转换为日期对象(适配DB门面查询场景)
引入Carbon日期处理类,将字符串字段解析为日期对象后再调用格式化方法:
// 顶部引入Carbon类 use Carbon\Carbon; public function someFunction(int $referral_id) { $data = DB::table('someTables') ->where('referral_id', $referral_id) ->first(); return $data ? (object) [ 'planId' => $data->plan_id ?? '', 'comment' => $data->comment ?? '', 'facilitator' => $data->facilitator ?? '', // 先判断字段非空,再转对象格式化 'time' => $data->started_at ? Carbon::parse($data->started_at)->format('H:i:s') : '', ] : (object) []; }
方案2:改用Eloquent模型查询(自动处理日期转换)
如果对应数据表有创建Eloquent模型,可在模型中配置日期自动转换属性,查询后字段会自动转为Carbon对象:
// 对应数据表的模型文件中添加配置 protected $dates = [ 'started_at', ]; // 业务代码中可直接调用格式化方法 'time' => $data->started_at?->format('H:i:s') ?? '',
日期时间拆分输出实现
可以直接对同一个started_at字段按不同格式输出即可实现拆分,修改返回值部分如下:
return $data ? (object) [ 'planId' => $data->plan_id ?? '', 'comment' => $data->comment ?? '', 'facilitator' => $data->facilitator ?? '', // 拆分输出日期,格式可自定义调整 'date' => $data->started_at ? Carbon::parse($data->started_at)->format('Y-m-d') : '', // 拆分输出时间 'time' => $data->started_at ? Carbon::parse($data->started_at)->format('H:i:s') : '', ] : (object) [];
内容的提问来源于stack exchange,提问作者awthz Zei
相关产品推荐
相关产品推荐

