在 PHP 中扩展 DateTime 和 DateTimeImmutable

Extend DateTime and DateTimeImmutable in PHP

我有一堆以各种方式操纵 DateTime 的小程序函数,我想到如果我扩展 DateTime [=37= 可能更容易使用] 并将这些函数转换为 class.

的方法

好吧,很简单,我可以做到:

namespace My\Project;

class DateTime extends \DateTime {
    ... various new methods etc...
}

但是...我也使用 DateTimeImmutable 对象,并且还希望在 class 中添加这些内容。

有没有什么方法可以扩展 中的 class 以包含我的新功能 而无需重复代码 ? (是的,我知道我可以 copy/paste 将新方法转化为新的 classes。在这里尝试保持干爽。)

难道 PHP 没有办法将 "sideload" 编码成 class 吗?或扩展 DateTimeInterface 但还包含特定于 DateTimeDateTimeImmutable 的代码的方法?

像这样扩展常见的 classes 是不好的做法吗? (它会在路上咬我的屁股吗?)

只需创建两个 类,每个都扩展 DateTimeDateTimeImmutable,以及一个具有所有 "new methods, etc" 的特征,您可以 use直接在他们两个。

trait Convenient {
    public function echo() : void {
        echo "bar\n";
    }
}

class A extends \DateTime  {
    use Convenient;
}

class B extends \DateTimeImmutable {
    use Convenient;
}

关于"best practice",见仁见智;但很难想象有人会反对扩展 base 类。出于很多正当理由,它一直在完成。理想情况下,客户端脚本应该以接口为目标,而不是 类。

有几个广为人知且广泛使用的库,例如 Carbon or Chronos,它们扩展了基本日期时间对象。在重新发明它们之前,您可能想检查一下。