Tutorial OOP Lanjutan

Object Cloning And Comparing

Materi ini memiliki 1 buah lampiran. Namun Anda tidak dapat mengakses lampiran karena belum terdaftar di kursus ini. Klik disini untuk mendaftar.

Pada video ini kita akan membicarakan mengenai cara melakukan cloning dan membandingkan objek.

Sebelum melanjutkan ke object cloning, kita harus memahami terlebih dahulu bagaimana cara PHP menangani memory untuk menyimpan nilai di dalam variable. Untuk tipe data primitif, seperti bool, string, float dan int, nilai langsung disimpan di dalam memory.

Sebagai contoh misalkan kita membuat variable $name1 untuk menyimpan nilai ‘Budi’. Maka nilai ‘Budi’ disimpan langsung di bagian memory.

Selanjutnya kalau kita membuat variable $name2 untuk menyimpan nilai yang disimpan dalam variable $name1, maka PHP membuat salinan nilai ‘Budi’ dan menyimpannya di dalam memory sebagai variable $name2.

Jadi kalau kita mengubah nilai variable $name2 menjadi ‘Andi’, maka yang berubah hanya variable $name2 saja. Nilai dari variable $name1 tetap ‘Budi’.

Namun cara penanganan memory-nya berbeda untuk tipe data object. Kalau misalkan kita membuat variable $person1 untuk menyimpan data object Person, maka yang disimpan di dalam memory adalah pointer. Pointer ini berfungsi untuk menunjuk bagian lain dari memory yang biasanya disebut dengan nama heap. Data yang kita simpan di dalam object berada di dalam heap yang ditunjuk oleh pointer.

Pada saat kita membuat variable $person2 yang menyimpan nilai dari variable $person1, maka PHP menyimpan pointer yang sama pada variable $person2. Berhubung kedua variable merujuk ke data object yang sama, maka pada saat kita mengubah nilai name menjadi ‘Andi’ pada variable $person2, maka nilai name pada variable $person1 turut berubah.

Apabila kita ingin agar variable $person2 merujuk ke object yang berbeda dari variable $person1, maka kita bisa menggunakan kata kunci clone. PHP akan membuatkan object baru yang isinya sama persis dengan object $person1, dan kemudian variable $person2 menyimpan pointer yang merujuk ke object baru tersebut. Apabila kita melakukan perubahan data pada variable $person2, maka data pada variable $person1 tidak turut berubah.

Kita coba praktek. Kita buat file baru dengan nama primitif.php. Disini kita akan mencoba untuk menggunakan tipe data primitif untuk duplikasi data. Pertama kita buat dahulu variable $name1 untuk menyimpan string ‘Budi’. Kemudian kita buat variable $name2 untuk menyimpan nilai dari $name1. Dan kita ubah variable $name2 menjadi ‘Andi’.

Kita coba var_dump nilai dari name1 dan name2. Kita jalankan. Seperti yang sudah dijelaskan pada slide barusan. Untuk tipe data primitif, pada saat kita menjalankan kode $name2 = $name1. Maka PHP menyalin nilai ‘Budi’ untuk disimpan di variable $name2. Sehingga pada saat kita mengubah nilai $name2 menjadi ‘Andi’, maka yang berubah hanya nilai pada $name2 saja. Nilai pada $name1 masih tetap ‘Budi’.

Selanjutnya kita coba untuk tipe data Object. Pada folder class kita tambahkan file baru dengan nama Person.php. Di dalamnya kita buat class Person. Agar kodenya singkat, kita gunakan fitur promotion ya. Kita buat constructor dengan parameter public string $name dan public int $age.

Kita buat file baru main.php. Di dalamnya kita akan mencoba untuk melakukan duplikasi data dengan menggunakan tipe data object. Pertama kita panggil dahulu require_once dengan argument ‘class/Person.php’. Kemudian kita buat variable $person1 untuk menyimpan object Person(‘Budi’, 18). Lalu kita buat variable $person2 yang menyimpan nilai dari $person1. Lalu kita ubah property name dari $person2 menjadi ‘Andi’. Terakhir kita coba var_dump nilai dari $person1 dan $person2.

Kita coba jalankan. Dan ternyata apa yang terjadi berbeda dari primitif.php. Pada saat kita mengubah nilai property name pada $person2, nilai pada $person1 turut berubah. Hal ini disebabkan karena untuk tipe data object, PHP menyimpan nilai pointer. Jadi pada saat kita menjalankan kode $person2 = $person1, maka PHP menyalin nilai pointer dari $person1 untuk disimpan di $person2. Kedua pointer merujuk ke object yang sama. Oleh karena itu pada saat kita merubah property menggunakan variable $person2, maka property pada $person1 turut berubah.

Kita lihat contoh lain dari penggunaan pointer. Sebagai contoh kita buat function baru dengan nama changeName dengan parameter Person $p. Di dalamnya kita ubah property name dari $p menjadi ‘Dewi’. Kemudian kita komentari semua kode yang berhubungan dengan $person2. Kita panggil fungsi changeName dengan menggunakan $person1 sebagai argument. Setelah itu kita var_dump($person1).

Kita simpan dan jalankan. Dan ternyata nama pada $person1 berubah menjadi ‘Dewi’. Jadi walaupun kita menggunakan parsing parameter by value, namun berhubung nilai yang dikirim adalah pointer, maka secara otomatis berubah menjadi reference. Kalau kita mengubah nilai property pada parameter $p, maka nilai pada argument $person1 turut berubah.

Bagaimana kalau kita ingin agar nilai pada $person1 tidak berubah? Maka kita bisa menggunakan kata kunci clone.

Jadi sekarang nilai pada $person1 sudah tidak berubah ya. Karena kita menggunakan kata kunci clone. PHP membuatkan object baru yang isinya sama persis dengan $person1, dan mengirimkan object tersebut sebagai argument. Jadi semua perubahan yang terjadi di dalam function, hanya mengubah isi dari object baru tersebut. Tidak mengubah object $person1.

Kita komentari lagi kode yang berhubungan dengan function changeName. Kita kembali ke kode $person2. Namun kodenya kita ubah sedikit ya, menjadi $person2 = clone $person1. Maka sekarang PHP membuat object baru yang isinya disalin dari $person1, untuk disimpan pada $person2. Artinya variable $person1 dan $person2 sekarang merupakan object yang berbeda. Jadi kalau kita jalankan. Nama yang berubah menjadi ‘Andi’ hanya pada $person2. Nama pada $person1 tetap ‘Budi’.

Pertanyaan berikutnya. Saat ini kan kita memiliki 2 buah property yang bersifat public. Bagaimana kalau property tersebut bersifat private? Apakah nilainya ikut disalin pada saat kita menggunakan kata kunci clone? Kita coba ya. Kita buka kembali file Person.php. Kita ubah property $age menjadi private.

Kita simpan dan jalankan. Kita bisa lihat sekarang bahwa property age sudah berubah menjadi private. Dan ternyata nilai pada kedua object adalah sama-sama 18. Artinya kata kunci clone turut memindahkan nilai dari property yang bersifat private ataupun protected.

Kita lanjutkan materi. Pada PHP terdapat magic method __clone. Artinya, kalau pada kelas terdapat method dengan nama __clone, maka method tersebut dijalankan setelah PHP melakukan clone. Kita bisa melakukan perubahan data pada object, dengan menuliskan kode di dalam method __clone.

Sebagai contoh, misalkan object kita mengandung data yang sensitif seperti resource. Pada saat kita melakukan clone, data sensitif tersebut turut dipindahkan ke object baru. Sedangkan kita ingin menghapus data tersebut. Maka kita bisa menulis kode untuk menghapus datanya di dalam method __clone.

Kita coba praktek. Kita buka file Person.php. Di dalam kelas, kita tambahkan public function __clone(): void. Di dalamnya kita hapus property age dengan kode unset($this->age).

Kita simpan dan jalankan script-nya. Perhatikan sekarang nilai property age pada $person2 sudah berubah menjadi uninitialized, artinya property tersebut sudah dihapus. Pada saat PHP melakukan clone, property age diisi dengan nilai 18. Namun setelah itu PHP menjalankan method __clone, dimana kita menghapus nilai pada property age.

Kita bisa membandingkan dua buah object, dengan menggunakan operator sama dengan, yang menggunakan lambang dua buah tanda sama dengan. Atau dengan menggunakan operator identik yang menggunakan lambang tiga buah tanda sama dengan.

Operator sama dengan akan membandingkan semua nilai di setiap property milik object. Apabila semua nilai pada property-nya sama, maka hasilnya true. Sedangkan operator identik akan membandingkan nilai pointer dari object tersebut. Kalau kedua pointer merujuk ke object yang sama, maka hasilnya true.

Kita coba praktek. Kita komentari semua kode yang ada. Kita mulai dari kode baru. Kita buat variable $person1 untuk menyimpan hasil new Person(‘Budi’, 18). Kemudian kita buat variable $person2 untuk menyimpan nilai $person1. Kita coba var_dump, pertama $person1 == $person2. Yang kedua $person1 === $person2.

Kalau kita jalankan. Maka yang pertama dari operator sama dengan kita mendapatkan hasil true, karena nilai dari semua property di dalam object adalah sama. Sedangkan yang kedua, operator identik juga memberikan nilai true, karena kedua variable menunjuk ke object yang sama. Seperti yang kita pelajari barusan, kalau kita mengubah property pada $person2, maka property pada $person1 turut berubah.

Kita copy paste dan kita komentari kode sebelumnya. Namun pada kode baru kita ubah menjadi $person1 = clone $person2.

Kita jalankan dan kita lihat hasilnya. Untuk operator sama dengan, kita mendapatkan hasil false. Hal ini terjadi karena nilai property age berubah. Kalau misalkan method __clone pada kelas Person kita hilangkan. Artinya nilai property age menjadi sama 18, maka kita mendapatkan hasil true. Namun berhubung sekarang ada method __clone yang menghapus nilai property age, maka hasilnya menjadi false.

Sedangkan untuk operator identik, kita selalu mendapatkan hasil false. Karena kedua variable sudah merujuk ke object yang berbeda.

2 Jam 41 Menit

Dengan menggunakan fasilitas tanya jawab, maka Anda bisa bertanya dan akan dijawab langsung oleh instruktur kursus.

Anda belum terdaftar pada kursus ini sehingga tidak bisa mengajukan pertanyaan.