Friday, December 5, 2014

Tutorial PHP OOP Part 20 : Pengertian Object Cloning

Object cloning adalah membuat object baru yang sama dengan object lama. Sekilas ini mirip dengan proses copy namun berbeda dalam penerapannya. Seperti kita ketahui bahwa sebuah object bukanlan sebuah variabel dengan value tetapi hanya sebuah reference yang mengacu pada properti dan method di dalam class.

Berikut ini contoh perbedaan copy pada object dan variabel :
Contoh copy pada variabel :

memberi nilai 5 pada variabel a
a=5;

mengkopi nilai variabel a ke variabel b
b=a;

sekarang variabel a bernilai 5 dan variabel b bernilai 5

mengganti nilai variabel a dengan 4
a=4;

sekarang variabel a bernilai 4 dan variabel b tetap bernilai 5


Hal ini tidak berlaku pada object, perhatikan contoh berikut ini :
 <?php  
 class Rumus {  
      var $panjang;  
      var $lebar;  

      function __construct($x,$y) {  
      $this->panjang =$x;  
      $this->lebar =$y;       
      }  

      function luas() {  
           return $this->panjang * $this->lebar;  
      }  
 }  

 $rumus1= new Rumus(6,7);  
 $rumus2 = $rumus1;  

 echo "Hasil sebelum properti panjang diganti: <br/>";   
 echo "Luas dari rumus1 = ".$rumus1->luas()."<br/>";  
 echo "Luas dari rumus2 = ".$rumus2->luas()."<br/><br/>";  

 //nilai properti panjang pada rumus2 diganti jadi 5  
 $rumus2->panjang=5;  

 echo "Hasil setelah properti panjang pada rumus2 diganti 5: <br/>";   
 echo "Luas dari rumus1 = ".$rumus1->luas()."<br/>";  
 echo "Luas dari rumus2 = ".$rumus2->luas()."<br/>";  
 ?>  
Jika program diatas dijalankan akan tampil seperti ini :
Hasil sebelum properti panjang diganti: 
Luas dari rumus1 = 42
Luas dari rumus2 = 42

Hasil setelah properti panjang pada rumus2 diganti 5: 
Luas dari rumus1 = 35
Luas dari rumus2 = 35

Terlihat bahwa hasil perhitungan method luas() pada rumus1 dan rumus2 setelah properti diganti adalah sama, meskipun kita hanya mengganti properti panjang rumus2. Hal ini terjadi karena ketika kita mengganti properti pada rumus2 maka properti panjang pada object rumus1 juga ikut berubah.

Ini membuktikan bahwa object hanya sebatas reference saja. Jadi ketika yang direferen berubah maka yang hasil referensi juga ikut berubah karena hakikatnya hanya ada satu object saja.

Membuat cloning object

Dengan meng-kloning sebuah object kita akan mempunyai object baru yang sama dengan object lama namun mempunyai ruang serdiri dalam memori. Jadi ketika properti pada object lama diganti tidak akan mempengaruhi properti pada object baru hasil kloningan.

Untuk membuat object kita menggunakan keyword "clone".
Perhatikan contoh diatas setelah kita menggunakan clone pada rumus1 dan rumus2 berikut ini :
 <?php  
 class Rumus {  
      var $panjang;  
      var $lebar;  

      function __construct($x,$y) {  
      $this->panjang =$x;  
      $this->lebar =$y;       
      }  

      function luas() {  
           return $this->panjang * $this->lebar;  
      }  
 }  

 $rumus1= new Rumus(6,7);  
 $rumus2 = clone $rumus1;  

 echo "Hasil sebelum properti panjang diganti: <br/>";   
 echo "Luas dari rumus1 = ".$rumus1->luas()."<br/>";  
 echo "Luas dari rumus2 = ".$rumus2->luas()."<br/><br/>";  

 //nilai properti panjang pada rumus diganti jadi 5  
 $rumus2->panjang=5;  

 echo "Hasil setelah properti panjang pada rumus2 diganti 5: <br/>";   
 echo "Luas dari rumus1 = ".$rumus1->luas()."<br/>";  
 echo "Luas dari rumus2 = ".$rumus2->luas()."<br/>";  
 ?>  
Jika program diatas dijalankan akan tampil seperti ini :
Hasil sebelum properti panjang diganti: 
Luas dari rumus1 = 42
Luas dari rumus2 = 42

Hasil setelah properti panjang pada rumus2 diganti 5: 
Luas dari rumus1 = 42
Luas dari rumus2 = 35

Hasil yang diperoleh dari rumus1 dan rumus2 setelah mengganti properti terlihat berbeda. Hal ini karena rumus2 merupakan object baru hasil dari cloning rumus1. Dengan demikian object rumus2 mempunya memori untuk menyimpan properti dan methodnya sendiri.

Mengapa menggunakan cloning, mengapa kita tidak membuat instantisasi saja lagi untuk object baru ?

Jika kita berkata tentang pemrograman berorientasi object tentunya tidak hanya PHP saja. Penggunaan cloning pada PHP OOP ini lebih kearah penyeragaman bahasa terharap  bahasa pemrograman berorientasi object lainnya.

Selain itu membuat instantisasi baru akan mengharuskan kita mendefinisikan semua properti pada konstruktor. Hal ini kurang cocok saat kita melakukan pemrograman secara tim, dimana teman kita perlu mengakses object yang kita buat namun dia ingin mengganti salah satu properti saja.

Dengan cloning object maka dia cukup mengambil object yang kita buat lalu mengganti properti yang diinginkan tanpa harus instantisasi semua properti.

Penggunaan method __clone() pada proses cloning

PHP memberikan sebuah magic method bernama __clone untuk menangani hal-hal yang berkaitan dengan proses cloning. Method ini akan otomatis diakses setelah proses cloning object selesai.

Contoh penggunaan method __clone dengan memodifikasi contoh program diatas :
 <?php  
 class Rumus {  
      var $panjang;  
      var $lebar;  
      function __construct($x,$y) {  
      $this->panjang =$x;  
      $this->lebar =$y;       
      }  
      function luas() {  
           return $this->panjang * $this->lebar;  
      }  
      function __clone() {  
           $this->panjang++;  
      }  
 }  
 $rumus1= new Rumus(6,7);  
 $rumus2 = clone $rumus1;  
 echo "Hasil rumus1 dan rumus2 setelah cloning: <br/>";   
 echo "Luas dari rumus1 = ".$rumus1->luas()."<br/>";  
 echo "Luas dari rumus2 = ".$rumus2->luas()."<br/>";  
 ?>  
Jika program diatas dijalankan akan tampil seperti ini :
Hasil rumus1 dan rumus2 setelah cloning: 
Luas dari rumus1 = 42
Luas dari rumus2 = 49

Tampak hasil perhitungan method luas() pada rumus1 dan rumus2 berbeda. Method luas() pada rumus1 menghasilkan 42 sedangkan method luas() pada rumus2 menghasilkan 49.

Hal ini karena setelah proses cloning rumus1 menjadi rumus2 program otomatis menjalankan method __clone yang berisi perintah menambah 1 pada properti panjang, yaitu : $this->panjang++.

Referensi :

1 komentar:

  1. Terimakasih Pak, penjelasannya mudah dimengerti.

    ReplyDelete