Сделайте так, чтобы DateTime::createFromFormat() возвращал дочерний класс вместо родительского


Я расширяю DateTime действительно добавляю некоторые полезные методы и константы.

При использовании new для создания нового объекта все в порядке, но при использовании статического метода createFromFormat он всегда возвращает исходный объект DateTime и, конечно, ни один из дочерних методов не доступен.

Я использую следующий код, чтобы обойти эту проблему. Это лучший подход?

namespace NoiseLabs\DateTime;

class DateTime extends \DateTime
{
    static public function createFromFormat($format, $time)
    {
        $ext_dt = new self();

        $ext_dt->setTimestamp(parent::createFromFormat($format, time)->getTimestamp());

        return $ext_dt;
    }
}
Author: Justin Johnson, 2011-03-27

3 answers

Это правильный путь. Однако, поскольку, похоже, вы хотите сделать класс DateTime расширяемым, я бы посоветовал вам использовать static вместо self:

namespace NoiseLabs\DateTime;

class DateTime extends \DateTime
{
    static public function createFromFormat($format, $time)
    {
        $ext_dt = new static();
        $parent_dt = parent::createFromFormat($format, $time);

        if (!$parent_dt) {
            return false;
        }

        $ext_dt->setTimestamp($parent_dt->getTimestamp());
        return $ext_dt;
    }
}

В этом нет необходимости, если вы не планируете расширять класс, но если кто-то когда-нибудь это сделает, это избавит его от необходимости снова выполнять тот же обходной путь.

 11
Author: netcoder, 2018-01-25 19:36:32

Я думаю, что ваше решение прекрасно. Альтернативный способ (просто немного переработанный) заключается в следующем:

public static function fromDateTime(DateTime $foo)
{
  return new static($foo->format('Y-m-d H:i:s e')); 
}

public static function createFromFormat($f, $t, $tz)
{
  return static::fromDateTime(parent::createFromFormat($f, $t, $tz));
}

Я не уверен, каков наилучший способ реализации fromDateTime. Вы даже могли бы взять то, что у вас есть, и положить это туда. Просто убедитесь, что вы не потеряли часовой пояс.

Обратите внимание, что вы могли бы даже реализовать __callStatic и использовать немного размышлений, чтобы сделать это доказательством в будущем.

 0
Author: Matthew, 2011-03-27 17:46:42
class DateTimeEx extends DateTime
{
    static public function createFromFormat($format, $time, $object = null)
    {
        return new static(DateTime::createFromFormat($format, $time, $object)->format(DateTime::ATOM));
    }
}
 0
Author: TobiasDeVil, 2016-04-22 09:52:49