You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:45:03