为什么我在使用它之前只能dump()
到达我的日期对象?
这是我的功能:
public function checkSubscriptionEndDate($user){
$subscriptionEndDate = $user->getSubscriptionEndDate();
dump($subscriptionEndDate);
if($subscriptionEndDate==null){
$subscriptionEndDateMessage = $this->get('translator')->trans('subscriptionEndDateMessage');
$subscriptionStatus = "error";
}else{
$subscriptionEndDateDate = $subscriptionEndDate->date;
// CHECK IF SUBSCRIPTION END DATE IS BEFORE NOW
if (date('now') < $subscriptionEndDateDate) {
dump('before');
$subscriptionStatus = "success";
$subscriptionEndDateMessage = $this->get('translator')->trans('subscriptionStatusSuccess').' '.date('d/m/Y',strtotime($subscriptionEndDateDate));
}else{
dump('after');
$subscriptionStatus = "error";
$subscriptionEndDateMessage = $this->get('translator')->trans('subscriptionStatusError').' '.date('d/m/Y',strtotime($subscriptionEndDateDate));
}
}
return array(
'subscriptionEndDateMessage' => $subscriptionEndDateMessage,
'subscriptionStatus' => $subscriptionStatus
);
return $subscriptionEndDateMessage;
}
当我这样做时,页面按预期加载,没有问题。但如果我删除这一行:
dump($subscriptionEndDate);
我无法再加载$subscriptionEndDate->date
,如此错误页面所示:
答案 0 :(得分:7)
这看起来像是人们经常询问的this strange-looking thing with var_dump
/print_r
and DateTime
objects的另一个例子。
转储函数将date
属性添加到$subscriptionEndDate
中的DateTime对象,以提供内部数据的人类可读表示,但它不是对象的属性。默认值。
您可以创建一个新的DateTime对象来代表当前的日期和时间,而不是获取字符串。 Those objects are directly comparable(since PHP 5.2.2)。
所以不要这样:
$subscriptionEndDateDate = $subscriptionEndDate->date;
// CHECK IF SUBSCRIPTION END DATE IS BEFORE NOW
if (date('now') < $subscriptionEndDateDate) {
使用它:
$now = new DateTime;
// CHECK IF SUBSCRIPTION END DATE IS BEFORE NOW
if ($now < $subscriptionEndDate) {
如果您尚未将$subscriptionEndDate
转换为字符串$subscriptionEndDateDate
,则此后续部分无法正常工作:
date('d/m/Y',strtotime($subscriptionEndDateDate)
因此,您可以使用format
方法。
$subscriptionEndDate->format('d/m/Y')
无论如何,这似乎更好,在我看来,因为你不会从DateTime转换为字符串到时间戳回到字符串,你只需要直接转换为字符串一次。