$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Sekarang $date1
dan $date2
berisi tanggal yang sama - tiga tahun dari sekarang. Saya ingin membuat dua waktu terpisah, satu yang diurai dari string dan satu lagi dengan tiga tahun ditambahkan ke dalamnya. Saat ini saya telah meretasnya seperti ini:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
tapi itu sepertinya peretasan yang menghebohkan. Apakah ada cara yang "benar" untuk menyalin mendalam objek DateTime?
Kloning tanggal dengan operator klon :
Klon dangkal secara default, tetapi cukup dalam untuk DateTime. Dalam objek Anda sendiri, Anda dapat menentukan
__clone()
metode ajaib untuk mengkloning properti (yaitu objek anak) yang masuk akal untuk dikloning saat objek induk berubah.(Saya tidak yakin mengapa dokumentasi menganggap contoh yang baik tentang perlunya mengkloning objek adalah GTK. Siapa yang menggunakan GTK di PHP?)
sumber
PHP 5.5.0 memperkenalkan DateTimeImmutable . menambah dan mengubah metode kelas ini mengembalikan objek baru.
sumber
DateTime
dengan aDateTimeImmutable
. Setidaknya adaIntlDateFormatter::formatObject
yang tidak suka yang tidak dapat diubah (mengembalikanfalse
alih-alih string yang diformat).DateTime
objek saya dalam loop for: D Ini menyelesaikannya dengan baik ...TLDR:
(Salinan dangkal sekarang - Penyalinan mendalam DateTime membuat (saat ini) tidak masuk akal )
Sederhana seperti itu :)
Penjelasan "php buat objek datetime dari datetime lain":
clone
kunci membuat salinan biasa yang dangkal - enaugh untuk kasus ini (mengapa => lihat di bawah)()
mengevaluasi ekspresi yang mengembalikan objek yang baru dibuat olehclone
->modify()
oleh karena itu dipanggil dan memodifikasi objek baruDateTime::modify(...)
dokumen:$date2
sekarang berisi clone / copy yang baru dibuat & dimodifikasi, sementara$date1
tetap tidak berubahMengapa Anda tidak perlu menyalin dalam di sini:
Salin / kloning mendalam hanya diperlukan, saat Anda perlu menyalin target properti yang menjadi referensi , tetapi ini:
keluaran:
jadi tidak ada referensi, cukup tipe sederhana => tidak perlu deep copy.
sumber
Anda harus mengubah Anda
DateTime
menjadiDateTimeImmutable
kemudian Anda dapat memanggil metode apa pun
DateTime
tanpa khawatir akan berubahsumber
add
padadate2
perubahan nilaidate1
dan tidak ada cara untuk menyalin nilaiDateTime
variabel kecuali Anda memilikiDateTimeImmutable