2016-06-03 2 views
2

Недавно я обнаружил, что есть DateTimeInterface. Когда я работал с \DateTime и \DateTimeImmutable, я думал, что было бы хорошо набирать шрифт.Должен ли я использовать `DateTimeInterface` в моем проекте php?

Еще на Changelog на php.net он говорит, что с 5.5.8:

Попытка реализовать DateTimeInterface вызывает фатальную ошибку в настоящее время. Раньше реализация интерфейса не вызывала ошибки, но поведение было ошибочным.

Это читает, что я никогда не сможет реализовать свой собственный CustomDateTime класс, реализующий DateTimeInterface, который кажется довольно странным.

Должен ли я использовать DateTimeInterface в своем коде пользователя?

Чувство кишки говорит мне не об этом. Тем не менее, он также не чувствует себя хорошо, чтобы typehint объект, т.е.

@var \DateTime|\DateTimeImmutable|\MyCustomDateTime 

ответ

5

Вы можете использовать DateTimeInterface typehint, когда вы ожидаете, либо один из нативных вариантов DateTime, например, \DateTime или \DateTimeImmutable.

Но документы говорят

Это не представляется возможным реализовать этот интерфейс с классами пользовательскими.

Так что если вы планируете реализовать \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:

Т.Л., Д.Р. основные функции, которые принимают DateTime и DateTimeImmutable (DateTimeInterface) работают непосредственно на структурах timelib, поэтому они будут разбиты, если вы передадите им определенный пользователем класс. Однако есть обходной путь - всегда нужно вызывать метод пользовательского класса непосредственно из встроенных функций, поэтому, если вы вызовете (new DateTime())->diff(new UserDefinedDateTime()), он в конце концов вызовет UserDefinedDateTime#diff, который должен будет реализовать логику.

1

Я бы сказал, что вы не должны.

The \ DateTimeInterface - это деталь реализации ext/date, которая не должна была отображаться в пользовательском коде.

См RFC, созданного для его удаления: https://wiki.php.net/rfc/drop-datetimeinterface

Смежные вопросы