Answers:
$date1 = new DateTime();
$date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
更新:
如果要复制而不是引用现有的DT对象,请使用clone
,而不是=
。
$a = clone $b;
使用克隆运算符克隆日期:
$date1 = new DateTime();
$date2 = clone $date1;
$date2->add(new DateInterval('P3Y'));
默认情况下,克隆是浅的,但对于DateTime来说足够深。在您自己的对象中,您可以定义__clone()
magic方法来克隆属性(即子对象),这些属性在父对象发生更改时应该被克隆。
(我不确定文档为什么会认为需要克隆对象的一个好例子就是GTK。谁在PHP中使用GTK?)
PHP 5.5.0引入了DateTimeImmutable。此类的添加和修改方法返回新对象。
$date1 = new DateTimeImmutable();
$date2 = $date1->add(new DateInterval('P3Y'));
DateTime
为DateTimeImmutable
。至少有IntlDateFormatter::formatObject
一点是不喜欢不可变的(返回false
而不是格式化的字符串)。
DateTime
在for循环中修改对象来遇到面向对象的陷阱:D这很好地解决了它……
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(浅拷贝enaugh - 深层复制-ING的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"
}
因此没有引用,只是简单的类型=>无需深度复制。
您应该将其更改DateTime
为DateTimeImmutable
// from date time
$date = \DateTimeImmutable::createFromMutable($mutableDate)
那么您可以在上调用任何方法DateTime
而不必担心其更改
add
上调用方法来date2
更改value的值,date1
并且DateTime
除非您具有DateTimeImmutable