在Laravel 5.2控制器中使用PHP Carbon时,变量似乎彼此绑定。因此,改变一个会影响其他人;
PHP功能:
$now = Carbon::now();
var_dump($now);
$from = $now;
$from->startOfYear();
var_dump('-----------------------------------');
var_dump($now, $from);
结果:
object(Carbon\Carbon)[225]
public 'date' => string '2016-02-13 21:55:36.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
string '-----------------------------------' (length=35)
object(Carbon\Carbon)[225]
public 'date' => string '2016-01-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(Carbon\Carbon)[225]
public 'date' => string '2016-01-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
将$from
设置为年初也影响了$now
,我看不清楚原因,搜索互联网也没有给我任何帮助。此外,在函数中,我将需要根据其他碳日期访问和操作碳日期,因此我不能将Carbon::now()
用于碳日期的每个单独实例。
我该如何解决这个问题?是什么导致了它?
我无法回答为什么会这样,但我找到了一个临时解决方案,直到我能够找到它的底部。从原始Carbon日期创建一个新的Carbon日期,转换为字符串。例如,$from = $new;
变为$from = new Carbon($now->toDateTimeString());
。您也可以像往常一样访问方法;
$from = (new Carbon($now->toDateTimeString()))->startOfYear();
。
答案 0 :(得分:9)
当您指定一个对象时,您可以分配其内存地址,而不是创建2个不同的碳对象,而是对同一个对象进行了2次引用。
而不是 -
$from = $now;
使用 -
$from = clone $now;
你也可以使用碳copy()
方法,它基本上和你在' hack'中做的一样。 -
$from = $now->copy();