继承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
相关产品推荐
相关产品推荐

