最近,我发现有一个DateTimeInterface
。在我使用\DateTime
和\DateTimeImmutable
时,我认为输入提示符号是好的。
然而在php.net上的Changelog上,它说自5.5.8以来:
尝试实现DateTimeInterface现在会引发致命错误。以前实现接口没有引发错误,但是 行为是错误的。
这说明我永远无法实现我自己的CustomDateTime
类实现DateTimeInterface
,这似乎很奇怪。
我应该在用户代码中使用DateTimeInterface
吗?
我的直觉告诉我不要。然而,输入物体也是不对的,即
@var \DateTime|\DateTimeImmutable|\MyCustomDateTime
答案 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核心函数接受
DateTime
和DateTimeImmutable
(DateTimeInterface
基本上)直接在timelib结构上运行,因此如果你将它们传递给用户定义的类,它们将会中断。虽然有一个解决方法 - 总是直接从内置函数调用用户定义的类方法,所以如果你打电话给(new DateTime())->diff(new UserDefinedDateTime())
它会调用UserDefinedDateTime#diff
最后需要实现逻辑。
答案 1 :(得分:2)
我会说你不应该。
\ DateTimeInterface是ext / date的一个实现细节,不应该暴露给用户态代码。
请参阅为删除而创建的RFC:https://wiki.php.net/rfc/drop-datetimeinterface