使date_create()与DateTime子类一起使用

时间:2011-04-01 20:16:26

标签: php oop datetime

关于php的DateTime类的一个令人烦恼的事情是它没有__toString()方法,这意味着每次尝试在字符串上下文中使用它时都会抛出错误。所以我扩展了它:

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对象?

3 个答案:

答案 0 :(得分:0)

  

那么,任何想法如何让date_create()返回一个ZDateTime对象?

你做不到。只有极少数例外(PDO),返回新实例的内置类和函数无法返回子类。

考虑向执行相同操作的ZDateTime类添加一个新的静态方法:创建对象,但返回false而不是在传递的字符串不可解析时抛出异常。你只需要在函数内捕获异常。

答案 1 :(得分:0)

date_create()DateTime构造函数的别名。因此,只需创建ZDateTime的新实例。

如果您发现自己有DateTime个对象,可以在课堂上执行此操作:

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

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

然后你可以扩展一些静态方法,如:

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

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

答案 2 :(得分:0)

最简单的方法可能只是创建zdate_create功能并进行大规模搜索&取代

可以这样做,但你可以用vanilla 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