Как сделать глубокую копию объекта DateTime?

$date1 = $date2 = new DateTime(); $date2->add(new DateInterval('P3Y')); 

Теперь $date1 и $date2 содержат ту же дату – через три года. Я хотел бы создать два отдельных периода времени, один из которых анализируется из строки и один с тремя годами, добавленными к нему. В настоящее время я взломал это так:

 $date2 = new DateTime($date1->format(DateTime::ISO8601)); 

но это кажется ужасным взломом. Есть ли «правильный» способ глубоко скопировать объект DateTime?

Solutions Collecting From Web of "Как сделать глубокую копию объекта DateTime?"

 $date1 = new DateTime(); $date2 = new DateTime(); $date2->add(new DateInterval('P3Y')); 

Обновить:

Если вы хотите скопировать, а не ссылаться на существующий объект DT, используйте clone , not = .

$a = clone $b;

Клонирование даты с помощью оператора клона :

 $date1 = new DateTime(); $date2 = clone $date1; $date2->add(new DateInterval('P3Y')); 

Клоны по умолчанию мелкие, но достаточно глубокие для DateTime. В ваших собственных объектах вы можете определить магический метод __clone() для клонирования свойств (т.е. дочерних объектов), которые имеют смысл клонировать, когда родительский объект изменяется.

(Я не уверен, почему документация считает хорошим примером необходимости клонирования объекта GTK. Кто использует GTK в PHP?)

В PHP 5.5.0 введен DateImmutable . добавлять и изменять методы этого класса, возвращать новые объекты.

 $date1 = new DateTimeImmutable(); $date2 = $date1->add(new DateInterval('P3Y')); 

Вы должны изменить DateTime на DateTimeImmutable

 // from date time $date = \DateTimeImmutable::createFromMutable($mutableDate) 

то вы можете вызвать любой метод в DateTime не беспокоясь об этом.