0

我有一个奇怪的问题。我不知何故无法在数组中使用上述函数,但只需查看我的源代码:

public function getDeploymentHours($refDate = NULL)
{
        if(empty($refDate)){
            $refDate = Carbon::now();
        } else {
            $refDate = new Carbon($refDate);
        }

        echo $refDate->startOfWeek();                   
        // outputs: 2015-03-16 00:00:00

        echo "<br>";
        echo $refDate->endOfWeek();                 
        // outputs:  2015-03-22 23:59:59

        $a = [$refDate->startOfWeek(),
                    $refDate->endOfWeek()];
        print_r($a);                                    

        // outputs: Array
        //(
        //    [0] => Carbon\Carbon Object
        //        (
        //            [date] => 2015-03-22 23:59:59
        //            [timezone_type] => 3
        //            [timezone] => UTC
        //        )
        //    [1] => Carbon\Carbon Object
        //        (
        //            [date] => 2015-03-22 23:59:59
        //            [timezone_type] => 3
        //            [timezone] => UTC
        //        )
        //)
}

我觉得这很奇怪。有人能想象这是怎么可能的吗?

4

1 回答 1

1

这是因为两个原因。

1. 碳会自我修饰。

当你打电话时startOfWeek()$refDate实际上发生了变化。您不仅会获得返回的新日期,而且会将更改设置为实际的碳对象,因此您何时也可以这样做:

$refDate->startOfWeek();
echo $refDate;

并会得到相同的结果...

2. 碳回归自身。

大多数 Carbons 函数实际上返回对象本身。例如,如果我们追踪startOfWeek()它,它最终startOfDay()看起来像这样:

public function startOfDay()
{
    return $this->hour(0)->minute(0)->second(0);
}

所以毕竟它返回的结果second(0)。哪个是...

public function second($value)
{
    $this->second = $value;

    return $this;
}

$this!!所以 Carbon 返回了自己。

结论

因为方法实际上发生$refDate了变化并且方法返回了自身,所以您将完全相同的对象转储了两次。

使固定

您可以简单地clone将对象实例具有两个单独的 Carbon 对象:

$refDate2 = clone $refDate;

$a = [$refDate->startOfWeek(),
      $refDate2->endOfWeek()];
print_r($a);        
于 2015-03-19T22:17:32.183 回答