$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Jetzt $date1
und $date2
mit demselben Datum - in drei Jahren. Ich möchte zwei separate Datumsangaben erstellen, eine, die aus einer Zeichenfolge analysiert wird, und eine, der drei Jahre hinzugefügt wurden. Derzeit habe ich es so gehackt:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
aber das scheint ein schrecklicher Hack zu sein. Gibt es eine "richtige" Möglichkeit, ein DateTime-Objekt tief zu kopieren?
Klonen Sie das Datum mit dem Klonoperator :
Klone sind standardmäßig flach, aber tief genug für eine DateTime. In Ihren eigenen Objekten können Sie die
__clone()
magische Methode definieren , um die Eigenschaften (dh untergeordnete Objekte) zu klonen, deren Klonen sinnvoll ist, wenn sich das übergeordnete Objekt ändert.(Ich bin mir nicht sicher, warum die Dokumentation GTK als gutes Beispiel für das Klonen eines Objekts ansieht. Wer verwendet GTK in PHP?)
quelle
PHP 5.5.0 führte DateTimeImmutable ein . Methoden zum Hinzufügen und Ändern dieser Klasse geben neue Objekte zurück.
quelle
DateTime
mit einem tauschen könnenDateTimeImmutable
. ZumindestIntlDateFormatter::formatObject
mag das nicht unveränderlich (gibtfalse
anstelle der formatierten Zeichenfolge zurück).DateTime
Objekt in einer for-Schleife geändert habe: D Das hat es gut gelöst ...TLDR:
(Flache Kopie ist genug - Tiefes Kopieren DateTime macht (derzeit) keinen Sinn )
So einfach ist das :)
Erläuterung "php create datetime object from other datetime":
clone
Schlüsselwort erstellt regelmäßig flache Kopien - genug für diesen Fall (warum => siehe unten)()
, wird der Ausdruck ausgewertet, der das neu erstellte Objekt von zurückgibtclone
->modify()
wird daher aufgerufen und modifiziert das neue ObjektDateTime::modify(...)
docs:$date2
Enthält jetzt den neu erstellten und geänderten Klon / die neu geänderte Kopie,$date1
bleibt jedoch unverändertWarum müssen Sie hier nicht tief kopieren:
Deep Copy / Clone ist nur erforderlich, wenn Sie Ziele von Eigenschaften kopieren müssen, die Referenzen sind , aber dies:
Ausgänge:
Es gibt also keine Referenzen, nur einfache Typen => Sie müssen nicht tief kopieren.
quelle
Sie sollten Ihre ändern
DateTime
zuDateTimeImmutable
Dann können Sie eine beliebige Methode aufrufen,
DateTime
ohne sich Gedanken über die Änderung machen zu müssenquelle
add
beidate2
den Wert von ändertdate1
und es keine Möglichkeit gibt, den Wert derDateTime
Variablen zu kopieren , es sei denn, Sie haben einDateTimeImmutable