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