PHP Carbon - 彼此绑定的变量

时间:2016-02-13 22:05:48

标签: php laravel laravel-5.2 php-carbon

在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();

1 个答案:

答案 0 :(得分:9)

当您指定一个对象时,您可以分配其内存地址,而不是创建2个不同的碳对象,而是对同一个对象进行了2次引用。

而不是 -

$from = $now;

使用 -

$from = clone $now;

你也可以使用碳copy()方法,它基本上和你在' hack'中做的一样。 -

$from = $now->copy();

  

PHP Object Cloning