小智 14
这是一个我需要在前几天克隆一个对象的例子.我需要有两个DateTime对象,a from date和a to date.它们可以在URL参数中指定,但是可以省略任何一个,我需要将它们设置为默认值.
下面的例子已经有所简化了,所以实现中存在缺陷,如下所示,但它应该给你一个不错的主意.
问题出在DateTime :: modify方法中.让我们假设用户提供了从日期,但没有一个来约会.正因为如此,我们设置到日期是从给定的12个月从日期.
// create the from date from the URL parameters
$date_from = DateTime::createFromFormat('d/m/Y', $_GET['from']);
Run Code Online (Sandbox Code Playgroud)
DateTime类具有一种通过某种偏移来修改自身的方法.因此可以假设以下内容可行.
$date_to = $date_from;
$date_to->modify('+12 months');
Run Code Online (Sandbox Code Playgroud)
然而,这将导致两个$date_from和$date_to是同一日期,即使例如出现复制的可变$date_from进$date_to,它实际上是创建一个参考给它,而不是一个副本.这意味着当我们调用$date_to->modify('+12 months')它实际修改两个变量时,因为它们都指向DateTime对象的同一个实例.
这样做的正确方法是
$date_to = clone $date_from; // $date_to now contains a clone (copy) of the DateTime instance $date_from
$date_to->modify('+12 months');
Run Code Online (Sandbox Code Playgroud)
clone语句告诉PHP创建DateTime对象的新实例并将其存储$date_to.从那里,调用修改只会改变$date_to并$date_from保持不变.