2011-03-27 8 views
10

के बजाय बाल वर्ग लौटाएं मैं DateTime विस्तार कर रहा हूं कुछ उपयोगी विधियों और स्थिरांक जोड़ें।डेटटाइम बनाएं :: createFromFormat() माता-पिता

जब new का उपयोग कर एक नई वस्तु सब कुछ बनाने के लिए ठीक है, लेकिन जब स्थिर पद्धति का उपयोग करके यह हमेशा मूल DateTime ऑब्जेक्ट और बच्चे के तरीकों के पाठ्यक्रम कोई भी उपलब्ध हैं createFromFormat

मैं इस समस्या को रोकने के लिए निम्न कोड का उपयोग कर रहा हूं। क्या यह सबसे अच्छा तरीका है?

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

इस तरह मैं इसे करूँगा। – lonesomeday

+0

ठीक है। इस समीक्षा के लिए धन्यवाद, @lonesomeday। – noisebleed

उत्तर

10

यह जाने का तरीका है। हालांकि, लगता है के बाद से आप क्या करना चाहते है दिनांक समय वर्ग एक्स्टेंसिबल प्रस्तुत करना, मैं आप का उपयोग staticself के बजाय सुझाव देंगे:

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

यदि आप वर्ग का विस्तार करने की योजना नहीं है आवश्यक नहीं है, लेकिन अगर कोई कभी करता है, तो वह उसे फिर से वही काम करने से रोक देगा।

+0

सच है, यह अच्छा अभ्यास है, खेल में 'स्थिर' लाने के लिए धन्यवाद। मैं 'createFromFormat' की नकल करने और 'स्थिर' के साथ 'self' को प्रतिस्थापित करने की उम्मीद कर रहा था, लेकिन चूंकि' डेटटाइम 'सी कार्यान्वयन है, मुझे लगता है कि मैं कुछ भी नहीं कर सकता, है ना? – noisebleed

0

मुझे लगता है कि आपका समाधान ठीक है। एक वैकल्पिक तरीका (बस थोड़ा पुनर्संशोधित) यह है:

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
class DateTimeEx extends DateTime 
{ 
    static public function createFromFormat($format, $time, $object = null) 
    { 
     return new static(DateTime::createFromFormat($format, $time, $object)->format(DateTime::ATOM)); 
    } 
} 
संबंधित मुद्दे