TLDR:
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(Неглубоко копия не является enaugh - Deep копии-кий DateTime марки ( в настоящее время) нет смысла )
Просто как тот :)
Объяснение «php создает объект datetime из другого datetime»:
clone
Ключевые слова делают регулярную неглубокую копию - enaugh для этого случая (почему => смотри ниже)
- Обертывание его с помощью
()
оценивает выражение, возвращающее вновь созданный объект, с помощьюclone
->modify()
поэтому вызывается и изменяет новый объект
DateTime::modify(...)
документы:
Возвращает объект 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"
}
поэтому нет ссылок, только простые типы => не нужно углубляться копии.