Mutable dan Immutable DateTime di PHP, Ini Perbedaanya

Chronos Code Example

Tanggal yang dapat diubah dapat menjadi sumber kebingungan dan bug tak terduga dalam suatu aplikasi. Tujuan artikel ini bukan untuk memberi tahu bahwa objek DateTime buruk karena bisa berubah. Namun untuk mempertimbangkan untung dan rugi implementasi Mutable dan Immutable DateTime di PHP. Dalam artian objek tanggal yang dapat berubah dan tidak dapat berubah.

Pendekatan yang baik dalam menggunakan mutable dan immutable DateTime di PHP akan menjamin uji coba aplikasi yang baik. Selain itu dapat meningkatkan kesadaran tentang bagaimana metode pengubah dapat mempengaruhi objek tanggal di aplikasi Anda.

Sampai saat ini, saya bahkan tidak menyadari bahwa PHP menawarkan kelas DateTime dengan kemampuan khusus yaitu DateTimeImmutable. Kelas DateTimeImmutable bekerja sama halnya seperti kelas DateTime. Dengan pengecualian objek tersebut tidak pernah memodifikasi dirinya sendiri, tetapi mengembalikan sebuah objek baru sebagai gantinya. Jadi, jika Anda telah paham cara kerja DateTime, Anda dapat segera menggunakan DateTimeImmutable dengan tenang. Berdasarkan artikel yang dihimpun dari https://laravel-news.com, mari kita pahami perbedaan dan cara penggunaanya secara seksama.

Bekerja dengan Objek DateTime Mutable

Untungnya bagi kita sebagai manusia biasa, kita dapat lebih jauh memisahkan kelas-kelas ini dan bekerja dengan library seperti Carbon. Saya akan memperkenalkan kepada Anda library DateTimeImmutable yang terkenal setelah bagian ini.

Carbon mengextend berbagai variasi DateTime DateTimeImmutable. Oleh karena itu ketika menerapkan sebuah instance Carbon, setiap pemodifikasi yang memanggilnya (yaitu addDay()) akan menghasilkan perubahan:

Dalam konteks penggunaan model Eloquent, ini masuk akal. Jika tidak, ini akan menghasilkan keluaran yang aneh saat ingin memperbarui tanggal menggunakan pendekatan yang immutable :

Jika Anda bermaksud melakukan pengecekan perbandingan yang membutuhkan modifikasi, Anda perlu membuat salinan tanggal untuk menghindari mutasi atribut asli. Misalnya, dalam kode ini akan memutasi atribut model:

Hal lain yang menarik di sini adalah bahwa jika kode Anda memutasi tanggal, tetapi Anda tidak menyimpan model dengan method save(), Anda mungkin memiliki bug edge-case yang aneh dan sulit dilacak. Hal besar yang harus disadari adalah bagaimana kode memutasi tanggal, dan mengirimkan salinan tanggal daripada mengirim seluruh model ke method yang perlu melakukan modifikasi tanggal.

Saya tidak mencoba untuk berdebat bahwa menggunakan mutable library seperti Carbon itu salah. Saya berfokus untuk menunjukkan bagaimana library ini bekerja dan penanganan yang harus Anda terapkan untuk menghindari mutasi tak terduga.

Bekerja dengan Objek DateTime Immutable

Jika Anda suka bekerja dengan Carbon, tetapi ingin bereksperimen dengan versi immutable yang memiliki API serupa, Anda mungkin akan tertarik dengan library Chronos yang dibuat oleh yayasan CakePHP. Chronos awalnya didasarkan dari Karbon, dan merupakan perpustakaan yang berdiri sendiri tanpa ketergantungan eksternal di luar versi PHP ^5.5.9|^7.

Selain itu, library Chronos berisi variasi tanggal / waktu yang bisa berubah, totalnya ada lima kelas :

  • Cake\Chronos\Chronos adalah objek tanggal dan waktu yang tidak dapat berubah.
  • Cake\Chronos\Date merupakan objek tanggal yang tidak dapat berubah.
  • Cake\Chronos\MutableDateTime adalah objek tanggal dan waktu yang dapat berubah.
  • Cake\Chronos\MutableDate merupakan objek tanggal yang dapat berubah.
  • Cake\Chronos\ChronosInterval merupakan ekstensi ke objek DateInterval.

Dalam contoh kode sebelumnya, objek tanggal tidak berkaitan dengan mutasi karena perubahan apa pun kan mengembalikan objek baru:

Setiap kali memodifikasi suatu objek, salinan baru dikembalikan, membuat kode Anda bebas dari masalah ketergantungan berbasis order. Ambil contoh berikut:

Untuk bekerja dengan tanggal yang immutable, Anda perlu mengganti variabel saat bekerja dengan pengubah:

Bahkan jika ingin mengatur ulang tanggal ke awal hari, Anda harus melakukan hal yang sama, atau menghubungkannya ke pernyataan asli:

Pelajari Lebih Lanjut Mutable dan Immutable DateTime di PHP

Meskipun perbedaannya terasa halus, menggunakan objek tanggal immutable dapat memberi Anda keyakinan bahwa pengolahan tanggal tidak akan menyebabkan mutasi ke objek asli, kecuali secara eksplisit melakukan menetapkan ulang.

Jika Anda ingin bereksperimen lebih banyak dengan library DateTime yang immutable seperti Carbon, segera kunjungi dokumentasi Chronos.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.