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

继承DateTimeImmutable时__construct返回format结果为何不生效?

继承DateTimeImmutable时构造函数返回值无效的问题

我尝试自定义类继承DateTimeImmutable,在构造函数中调用parent::format('Y-m-d H:i')并返回,期望实例化时得到格式化后的字符串2022-10-01 15:38,但实际返回的仍是CastsDateTime对象。尽管PHP官方文档明确标注format方法的返回值为string(public format(string $format): string),但结果不符合预期。

问题代码示例:

<?php

class CastsDateTime extends DateTimeImmutable
{
    public function __construct(string $date)
    {
        parent::__construct($date);
        return parent::format('Y-m-d H:i');
    }
}

$date = new CastsDateTime('2022-10-01T15:38');

var_export($date); /* 返回结果:
CastsDateTime::__set_state(array(
   'date' => '2022-10-01 15:38:00.000000',
   'timezone_type' => 3,
   'timezone' => 'UTC',
)) */

问题原因

PHP的构造函数__construct()返回值会被强制忽略,无论你在构造函数里return什么,new操作符都会返回当前类的实例,这是PHP的语言特性,和format方法的返回值类型无关。

解决方案

使用__invoke()魔术方法,当对象被当作函数调用时,该方法会被触发,从而返回格式化后的字符串:

class CastsDateTime extends DateTimeImmutable
{
    public function __invoke()
    {
        return parent::format('Y-m-d H:i');
    }
}

// 实例化后以函数形式调用
echo (new CastsDateTime('2022-10-01T15:38'))();
// 输出:2022-10-01 15:38

内容的提问来源于stack exchange,提问作者bozsudo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:20:27