$date1 = $date2 = new DateTime(); $date2->add(new DateInterval('P3Y'));
Теперь $date1
и $date2
содержат ту же дату – через три года. Я хотел бы создать два отдельных периода времени, один из которых анализируется из строки и один с тремя годами, добавленными к нему. В настоящее время я взломал это так:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
но это кажется ужасным взломом. Есть ли «правильный» способ глубоко скопировать объект 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
не беспокоясь об этом.