Carbons [start/end]OfWeek 在数组中的问题

Trouble with Carbons [start/end]OfWeek in Arrays

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

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
        //        )
        //)
}

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

那是因为两个原因。

1。碳会自我修改。

当您调用 startOfWeek() 时,$refDate 实际上发生了变化。您不仅会得到新的日期 returned,而且更改会设置为实际的碳对象,因此您也可以这样做:

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

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

2。碳 return 本身。

Carbons 的大部分功能实际上 return 对象本身。例如,如果我们追踪 startOfWeek(),它会在 startOfDay() 结束,看起来像这样:

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

所以毕竟它 return 是 second(0) 的结果。这是...

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

    return $this;
}

$this!!所以 Carbon returns 本身。

结论

因为方法实际上改变了 $refDate 并且方法 return 本身你转储了完全相同的对象两次。

修复

您可以简单地 clone 对象实例来拥有两个独立的 Carbon 对象:

$refDate2 = clone $refDate;

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