我刚刚了解了 PHP 5.4 的这个奇特的新特性。 JsonSerializable
!这非常适合我的应用程序。
我的应用程序使用 DateTime 对象,当我使用json_encode
它们时,我得到以下信息(通过运行json_encode([new DateTime])
):
[{"date":"2013-09-11 15:39:22","timezone_type":3,"timezone":"UTC"}]
根据timezone_type
具体情况,timezone
值可能会有所不同。我还没有找到在 JavaScript 中解析这个对象的好方法。
因此,我决定创建自己的 DateTime 类,并按照我的意愿将其序列化为 JSON。
class SerialDateTime extends DateTime implements JsonSerializable{
public function jsonSerialize(){
return ['timestamp' => $this->getTimestamp()];
}
}
当我现在运行时json_encode([new SerialDateTime])
,我得到了这个:
[{"timestamp":1378914190}]
这在 JavaScript 中更容易解析。
所以,我认为这是一个很好的解决方案,但我发现了一个问题。静态方法! SerialDateTime::createFromFormat
返回一个DateTime
对象!
如果我这样做:json_encode([SerialDateTime::createFromFormat('m/d/Y', '10/31/2011')])
,我得到:
[{"date":"2011-10-31 15:46:07","timezone_type":3,"timezone":"UTC"}]
为什么会这样?为什么不SerialDateTime::createFromFormat
给我一个SerialDateTime
对象?!
我该如何解决这个问题,或者我是否需要覆盖in 中的所有静态方法?如果我这样做,我什至如何从该方法中创建一个新的?我怎样才能将对象“投射”到?DateTime
SerialDateTime
SerialDateTime
createFromFormat
DateTime
SerialDateTime
我想到了一个解决方法,但必须有更好的方法:
public static function createFromFormat($f, $t, $tz=NULL){
$dateTime = call_user_func(
array('SerialDateTime', 'parent::createFromFormat'),
$f, $t, $tz
);
$ret = new self();
return $ret->setTimestamp($dateTime->getTimestamp());
}
我可以使用__callStatic
andreturn call_user_func_array(array(__CLASS__ , 'parent::'.__FUNCTION__), func_get_args());
或其他东西吗?
太糟糕了,我不能神奇地转换DateTime
为使用后期静态绑定。