2011-03-27 18 views
10

yerine çocuk sınıfı döndürür Bazı yararlı yöntemler ve sabitler eklemek için DateTime yapıyorum.Make DateTime :: createFromFormat()

yeni nesne her şeyi yaratmak için new kullanarak iyi ama statik yöntemini kullanırken her zaman orijinal DateTime nesnesi döndüren ve çocuk yöntemlerinin elbette hiçbiri mevcuttur createFromFormat.

Bu sorunu aşmak için aşağıdaki kodu kullanıyorum. Bu en iyi yaklaşım mı?

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

Böyle yaparım. – lonesomeday

+0

Tamam. Bunu incelediğiniz için teşekkürler, @lonesomeday. – noisebleed

cevap

10

Bu yoldur. Ancak bu yana DateTime sınıfı genişletilebilir işlemek için yapmak istediğiniz edilir göründüğü gibi, sana static yerine self kullanımı öneririm: Sınıfa uzatma konusunda düşünmüyorsanız

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

Bu gerekli değil, ama Birisi varsa, yine aynı geçici çözümü yapmak zorunda kalmasını engeller.

+0

Doğru, bu iyi bir uygulama, 'statik' oyuna getirdiğiniz için teşekkürler. "CreateFromFormat" u taklit etmeyi umuyordum ve 'self'i' static'le değiştirmeyi umuyordum ama DateTime’ın bir C uygulaması olduğu için yapabileceğim başka bir şey yok sanırım, değil mi? – noisebleed

0

Bence çözümün iyi. (Sadece biraz refactored) diğer bir yolu şudur:

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

Ben iyi yolu fromDateTime olduğunu uygulamak için ne olduğundan emin değilim. Aldığın şeyi alıp oraya koyabilirsin. Sadece saat dilimini kaybetmemeye dikkat edin.

__callStatic'u uygulayabileceğinizi ve gelecekteki ispatı sağlamak için biraz yansıma kullanabileceğinizi unutmayın.

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