关于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
对象?
答案 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