$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Teraz $date1
i $date2
zawierają tę samą datę - za trzy lata. Chciałbym utworzyć dwa oddzielne czasy danych, jeden, który jest analizowany z ciągu, a drugi z dodanymi do niego trzema latami. Obecnie zhakowałem to w ten sposób:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
ale to wydaje się strasznym włamaniem. Czy istnieje „poprawny” sposób głębokiego skopiowania obiektu DateTime?
Sklonuj datę za pomocą operatora klonowania :
Klony są domyślnie płytkie, ale wystarczająco głębokie dla DateTime. W swoich własnych obiektach możesz zdefiniować
__clone()
magiczną metodę klonowania właściwości (tj. Obiektów potomnych), które mają sens przy klonowaniu po zmianie obiektu nadrzędnego.(Nie jestem pewien, dlaczego w dokumentacji za dobrym przykładem potrzeby sklonowania obiektu jest GTK. Kto używa GTK w PHP?)
źródło
PHP 5.5.0 wprowadziło DateTimeImmutable . dodawanie i modyfikowanie metod tej klasy zwraca nowe obiekty.
źródło
DateTime
naDateTimeImmutable
. PrzynajmniejIntlDateFormatter::formatObject
to nie lubi immutables (zwracafalse
zamiast sformatowanego ciągu).DateTime
obiekt w pętli for: D To ładnie to rozwiązało ...TLDR:
(Shallow kopia jest enaugh - Głębokie copy-ing DateTime marek (obecnie) nie sens )
Proste :)
Wyjaśnienie „php tworzy obiekt datetime z innej daty i godziny”:
clone
Słów kluczowych sprawia, że regularne płytkie kopię - enaugh w tym przypadku (dlaczego => patrz poniżej)()
wyrażenie zwracające nowo utworzony obiekt przezclone
->modify()
jest zatem wywoływana i modyfikuje nowy obiektDateTime::modify(...)
dokumenty:$date2
zawiera teraz nowo utworzony i zmodyfikowany klon / kopię, ale$date1
pozostaje niezmienionyDlaczego nie musisz tutaj kopiować głęboko :
Głębokie kopiowanie / klonowanie jest konieczne tylko wtedy, gdy trzeba skopiować cele właściwości, które są referencjami , ale to:
wyjścia:
więc nie ma odniesień, tylko proste typy => nie ma potrzeby głębokiego kopiowania.
źródło
Powinieneś zmienić
DateTime
naDateTimeImmutable
wtedy możesz wywołać dowolną metodę
DateTime
bez obawy o jej zmianęźródło
add
nadate2
zmienia wartośćdate1
i nie ma możliwości skopiowania wartościDateTime
zmiennej, chyba że maszDateTimeImmutable