在 PHP 中扩展 DateTime 和 DateTimeImmutable

Ste*_*n R 3 php oop datetime extend

我有一堆DateTime以各种方式进行操作的小程序函数,我突然想到,如果我扩展类DateTime并将这些函数转换为类的方法,那么使用起来可能会更容易。

好吧,很简单,我可以这样做:

namespace My\Project;

class DateTime extends \DateTime {
    ... various new methods etc...
}
Run Code Online (Sandbox Code Playgroud)

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

有没有某种方法可以扩展这两个类以包含我的新功能而无需重复代码?(是的,我知道我可以将新方法复制/粘贴到两个新类中。这里尽量保持干燥。)

PHP 没有某种方法可以将代码“旁加载”到类中吗?或者一种扩展但也包含特定于和 的DateTimeInterface代码的方法?DateTimeDateTimeImmutable

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

yiv*_*ivi 5

只需创建两个类,每个类都扩展 或DateTimeDateTimeImmutable以及一个带有所有“新方法等”的特征,您可以use直接在它们中使用它们。

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

class A extends \DateTime  {
    use Convenient;
}

class B extends \DateTimeImmutable {
    use Convenient;
}
Run Code Online (Sandbox Code Playgroud)

关于“最佳实践”,这是一个见仁见智的问题;但很难想象有人会反对扩展基类。出于很多正当的理由,人们总是这样做。理想情况下,客户端脚本应该针对接口,而不是类。

有一些众所周知且广泛使用的库,例如CarbonChronos,它们扩展了基本日期时间对象。在重新发明它们之前,您可能需要检查一下它们。