我应该在我的php项目中使用`DateTimeInterface`吗?

k0p*_*kus 4 php datetime interface

最近,我发现有一个DateTimeInterface.当我\DateTime和我一起工作时\DateTimeImmutable,我认为输入提示是件好事.

然而在php.net上的Changelog上它说自5.5.8以来:

尝试实现DateTimeInterface现在会引发致命错误.以前实现接口没有引发错误,但行为是错误的.

这说明我永远无法实现自己的CustomDateTime类实现DateTimeInterface,这看起来很奇怪.

我应该使用DateTimeInterface我的用户代码吗?

我的直觉告诉我不要.然而,对这个物体进行打字也是不对的,即

@var \DateTime|\DateTimeImmutable|\MyCustomDateTime
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 5

DateTimeInterface当您需要其中一个本机DateTime变体时,可以使用typehint,例如\DateTime\DateTimeImmutable.

但正如文档所说

无法使用userland类实现此接口.

因此,如果您计划\DateTimeInterface使用自己的实现实现,这将无法工作,例如

class MyDateTime implements \DateTimeInterface {} // will raise an error
Run Code Online (Sandbox Code Playgroud)

但是,您可以创建自己的界面并调整本机DateTime类.

interface MyDateTime { /* some methods */ }

class NativeDateTime implements MyDateTime 
{
    private $dateTime;

    public function __construct($args = 'now') {
        $this->dateTime = new \DateTimeImmutable($args);
    }

   /* some methods */
}
Run Code Online (Sandbox Code Playgroud)

或者你可以扩展原生的DateTime变体,然后DateTimeInterface显然会实现,例如

class MyDateTime extends \DateTimeImmutable 
{
    /* your modifications */
}

var_dump(new MyDateTime instanceof \DateTimeInterface); // true
Run Code Online (Sandbox Code Playgroud)

详细说明为什么您无法实现自己的类实现\DateTimeInterface:

tl; dr核心函数接受DateTimeDateTimeImmutable(DateTimeInterface基本上)直接在timelib结构上运行,因此如果你传递一个用户定义的类,它们将会中断.虽然有一个解决方法 - 它总是直接从内置函数调用用户定义的类的方法,所以如果你调用(new DateTime())->diff(new UserDefinedDateTime())它将最终调用UserDefinedDateTime#diff需要实现逻辑.