$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Теперь $date1
и $date2
содержат ту же дату - через три года. Я хотел бы создать две отдельные даты, одна из которых анализируется из строки, а другая - с добавлением трех лет. На данный момент взломал вот так:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
но это кажется ужасным взломом. Есть ли «правильный» способ глубокого копирования объекта DateTime?
Клонируйте дату с помощью оператора клонирования :
По умолчанию клоны неглубокие, но достаточно глубокие для DateTime. В ваших собственных объектах вы можете определить
__clone()
волшебный метод для клонирования свойств (т.е. дочерних объектов), которые имеют смысл клонировать при изменении родительского объекта.(Я не уверен, почему в документации говорится, что хорошим примером необходимости клонирования объекта является GTK. Кто использует GTK в PHP?)
источник
PHP 5.5.0 представил DateTimeImmutable . Методы добавления и изменения этого класса возвращают новые объекты.
источник
DateTime
наDateTimeImmutable
. По крайней мереIntlDateFormatter::formatObject
, это не любит неизменяемые (возвращаетfalse
вместо форматированной строки).DateTime
объект в цикле for: D Это прекрасно решило проблему ...TLDR:
(Неглубоко копия не является enaugh - Deep копии-кий DateTime марки ( в настоящее время) нет смысла )
Просто как тот :)
Объяснение «php создает объект datetime из другого datetime»:
clone
Ключевые слова делают регулярную неглубокую копию - enaugh для этого случая (почему => смотри ниже)()
оценивает выражение, возвращающее вновь созданный объект, с помощьюclone
->modify()
поэтому вызывается и изменяет новый объектDateTime::modify(...)
документы:$date2
теперь содержит только что созданный и измененный клон / копию,$date1
оставаясь неизменнымПочему вы не должны глубокой копии здесь:
Глубокое копирование / клонирование необходимо только тогда, когда вам нужно скопировать целевые объекты свойств, которые являются ссылками , но это:
выходы:
поэтому нет ссылок, только простые типы => не нужно углубляться копии.
источник
Вы должны изменить свой
DateTime
наDateTimeImmutable
тогда вы можете вызвать любой метод,
DateTime
не беспокоясь об его измененииисточник
add
наdate2
изменения значения ,date1
и нет никакого способа , чтобы скопировать значениеDateTime
переменной , если не имеютDateTimeImmutable