$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
现在$date1和$date2包含相同的日期 - 三年后.我想创建两个单独的日期时间,一个用字符串解析,另一个用三年时间添加到字符串中.目前我已经像这样破解了它:
$date2 =  new DateTime($date1->format(DateTime::ISO8601));
但这似乎是一个可怕的黑客.深度复制DateTime对象是否有"正确"的方法?
Amy*_*y B 157
$date1 = new DateTime();
$date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
更新:
如果要复制而不是引用现有DT对象,请使用clone,而不是=.
$a = clone $b;
rjm*_*nro 100
使用克隆运算符克隆日期:
$date1 = new DateTime();
$date2 = clone $date1;
$date2->add(new DateInterval('P3Y'));
默认情况下,克隆很浅,但对于DateTime来说足够深.在您自己的对象中,您可以定义__clone()魔术方法来克隆在父对象更改时有意义克隆的属性(即子对象).
(我不确定为什么文档认为需要克隆对象的一个很好的例子是GTK.谁在PHP中使用GTK?)
Ale*_*den 44
PHP 5.5.0引入了DateTimeImmutable.添加和修改此类的方法返回新对象.
$date1 = new DateTimeImmutable();
$date2 = $date1->add(new DateInterval('P3Y'));
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(浅拷贝被调用- 深度复制DateTime(当前)没有意义)
clone关键字使常规浅拷贝- enaugh此情况下(为什么=>见下文)()计算返回新创建对象的表达式clone ->modify() 因此被调用并修改新对象DateTime::modify(...) docs:
返回DateTime对象以进行方法链接或失败时返回FALSE。
$date2现在包含新创建和修改的克隆/副本,而$date1保持不变
仅当需要复制作为引用的属性的目标时,才需要深度复制/克隆,但这是:
class TestDateTime extends DateTime{
  public function test(){
   //*this* way also outputs private variables if any...
   var_dump( get_object_vars($this) );    
  }
}
$test = (new TestDateTime())->test();
输出:
array(3) {
  ["date"]=>
  string(26) "2019-08-21 11:38:48.760390"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
因此没有引用,只是简单的类型=>无需深度复制。