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

时间:2016-06-03 08:56:39

标签: php datetime interface

最近,我发现有一个DateTimeInterface。在我使用\DateTime\DateTimeImmutable时,我认为输入提示符号是好的。

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

  

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

这说明我永远无法实现我自己的CustomDateTime类实现DateTimeInterface,这似乎很奇怪。

我应该在用户代码中使用DateTimeInterface吗?

我的直觉告诉我不要。然而,输入物体也是不对的,即

@var \DateTime|\DateTimeImmutable|\MyCustomDateTime

2 个答案:

答案 0 :(得分:5)

如果您希望使用其中一个本机DateTime变体,则可以使用DateTimeInterface typehint,例如\DateTime\DateTimeImmutable

但正如文档所说

  

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

因此,如果您计划使用自己的实现来实现\DateTimeInterface,那么这将无效,例如。

class MyDateTime implements \DateTimeInterface {} // will raise an error

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

interface MyDateTime { /* some methods */ }

class NativeDateTime implements MyDateTime 
{
    private $dateTime;

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

   /* some methods */
}

或者您可以扩展本机DateTime变体,然后显然会实现DateTimeInterface,例如。

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

var_dump(new MyDateTime instanceof \DateTimeInterface); // true

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

  

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

答案 1 :(得分:2)

我会说你不应该。

  

\ DateTimeInterface是ext / date的一个实现细节,不应该暴露给用户态代码。

请参阅为删除而创建的RFC:https://wiki.php.net/rfc/drop-datetimeinterface