2011-04-01 91 views
1

有關php的DateTime類的惱人事情之一是它沒有__toString()方法,這意味着它每次嘗試在字符串上下文中使用它時都會引發錯誤。所以我擴展它:make date_create()與DateTime子類一起工作

class ZDateTime extends DateTime { 

    private $zformat='Y-m-d H:i:s'; 

    function __toString() { 
     return $this->format($this->zformat); 
    } 

    function set_format($format){ 
     $this->zformat=$format; //leaving out format validation for brevity 
    } 
} 

但現在我已經失去了所有的DateTime有一個像date_create()漂亮的程序功能和衆多的上市here其他功能。

我知道程序函數只是DateTime類方法的別名。但它們通常更易於使用,並且散佈在我的代碼中。將它們撈出將是一件非常痛苦的事情。那麼,任何想法如何讓date_create()返回一個ZDateTime對象?

回答

0

最簡單的方法可能是隻是爲了創建一個zdate_create函數並做一個批量搜索&替換。

這是可以做到,但你可以做的唯一途徑是,在香草PHP(即:無runkit和這樣的)是:

ZDateTime.php

namespace MyDateTime; 

class ZDateTime extends \DateTime { 
    // do your stuff 
} 

function date_create($time = 'now', \DateTimeZone $timezone = null) { 
    if (isset($timezone)) { 
     return new ZDateTime($time, $timezone); 
    } else { 
     return new ZDateTime($time); 
    } 
} 

Some_Script.php

namespace MyDateTime; 
include 'ZDateTime.php'; 

$foo = date_create(); 
var_dump($foo); // ZDateTime object 
+0

我同意使用搜索和替換評論。我認爲這是對'namespace'的一種濫用,用它來以不兼容的方式覆蓋核心PHP函數。沒有理由不以正確的方式去做。 – Matthew 2011-04-01 20:46:21

+0

@konforce:我不認爲這是一種濫用。這是命名空間的一個優點。使用名稱空間的一個要點是能夠定義已定義的符號。我絕對認爲搜索和替換更好,但回答OP的問題,是的,它可以完成,唯一的方法是使用名稱空間。 – netcoder 2011-04-01 21:06:31

+0

我認爲這是一個濫用,因爲它是一個預先存在的問題的繃帶。也就是說,如果你開始新鮮的話,這不是你想要解決這個特殊問題的自然事情。引入命名空間實質上獲得一個免費的'__toString()'on日期對象對我來說是矯枉過正的。 – Matthew 2011-04-01 21:15:30

0

那麼,任何想法如何我可以使date_create()返回一個ZDateTime對象?

你不能那樣做。由於極少數例外(PDO),返回新實例的內置類和函數無法返回子類。

考慮爲您的ZDateTime類添加一個新的靜態方法來執行相同的操作:創建該對象,但返回false而不是在傳遞的字符串不可解析時拋出異常。你只需要捕捉函數內的異常。

0

date_create()DateTime構造函數的別名。因此,只需創建一個新實例ZDateTime

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

$foo = ZDateTime::fromDateTime($dt); 

然後,你可以延長一些像靜態方法:

,如果你有一個DateTime對象發現自己你能做到這一點在你的類

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

$dt = ZDateTime::createFromFormat(...); 
+0

雖然手冊堅持認爲它是構造函數的別名,但它的行爲不同。當傳遞的字符串不可解析時,而不是拋出異常,它只是返回false。 – Charles 2011-04-01 20:59:01