Сделайте так, чтобы 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;
}
}
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;
}
}
В этом нет необходимости, если вы не планируете расширять класс, но если кто-то когда-нибудь это сделает, это избавит его от необходимости снова выполнять тот же обходной путь.
Я думаю, что ваше решение прекрасно. Альтернативный способ (просто немного переработанный) заключается в следующем:
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
и использовать немного размышлений, чтобы сделать это доказательством в будущем.
class DateTimeEx extends DateTime
{
static public function createFromFormat($format, $time, $object = null)
{
return new static(DateTime::createFromFormat($format, $time, $object)->format(DateTime::ATOM));
}
}