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);
我有一个奇怪的问题。我无法在数组中使用上述函数,但请查看我的源代码:
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);