为什么我只能在使用之前转储()它时才能到达我的日期对象?

时间:2017-11-14 16:50:07

标签: php symfony datetime var-dump

为什么我在使用它之前只能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,如此错误页面所示:

enter image description here

1 个答案:

答案 0 :(得分:7)

这看起来像是人们经常询问的this strange-looking thing with var_dump/print_r and DateTime objects的另一个例子。

转储函数将date属性添加到$subscriptionEndDate中的DateTime对象,以提供内部数据的人类可读表示,但它不是对象的属性。默认值。

您可以创建一个新的DateTime对象来代表当前的日期和时间,而不是获取字符串。 Those objects are directly comparablesince 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转换为字符串到时间戳回到字符串,你只需要直接转换为字符串一次。