TLDR:
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(Неглибока копія є простою - глибоке копіювання DateTime не має сенсу )
Просто як це :)
Пояснення "php створити об'єкт дати з іншого часу":
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"
}
так що немає ніяких посилань, тільки прості типів => немає необхідності глибокої копії.