2011-04-01 93 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