2011-03-27 12 views
10

Extiendo DateTime agrego algunos métodos y constantes útiles.Make DateTime :: createFromFormat() devuelve clase secundaria en lugar de padre

Al usar new para crear un nuevo objeto todo está bien, pero cuando se usa el método estático createFromFormat siempre devuelve el objeto original DateTime y, por supuesto, ninguno de los métodos secundarios está disponible.

Estoy utilizando el siguiente código para evitar este problema. ¿Es este el mejor enfoque?

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; 
    } 
} 
+0

Así es como lo haría. – lonesomeday

+0

OK. Gracias por revisar esto, @lonesomeday. – noisebleed

Respuesta

10

Este es el camino a seguir. Sin embargo, ya que lo que parece que quiere hacer es hacer extensible la clase DateTime, sugeriría que utilice static en lugar de 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; 
    } 
} 

No es necesario si usted no planea en la ampliación de la clase, pero si alguien lo hace, le impedirá tener que hacer la misma solución de nuevo.

+0

Es cierto, esta es una buena práctica, gracias por traer 'estático' al juego. Tenía la esperanza de imitar 'createFromFormat' y reemplazar' self' con 'static' pero dado que' DateTime' es una implementación de C, supongo que no hay nada más que pueda hacer, ¿no? – noisebleed

0

Creo que su solución está bien. Una forma alternativa (solo un poco refactorizado) es la siguiente:

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)); 
} 

No estoy seguro de cuál es la mejor manera de poner en práctica el fromDateTime es. Incluso puedes tomar lo que tienes y ponerlo allí. Solo asegúrate de no perder la zona horaria.

Tenga en cuenta que incluso podría implementar __callStatic y utilizar un poco de reflexión para que sea a prueba en el futuro.

0
class DateTimeEx extends DateTime 
{ 
    static public function createFromFormat($format, $time, $object = null) 
    { 
     return new static(DateTime::createFromFormat($format, $time, $object)->format(DateTime::ATOM)); 
    } 
} 
Cuestiones relacionadas