Monday, December 1, 2014

Tutorial PHP OOP Part 16 : Konsep Overloading dalam PHP

Overloading di PHP menyediakan sarana untuk secara dinamis " menciptakan " properti dan metode . Entitas dinamis ini diproses melalui "magic method" yang dapat menciptakan berbagai tindakan di dalam class .

Metode overloading dipanggil saat berinteraksi dengan properti atau method yang belum dinyatakan atau tidak terlihat dalam ruang lingkup saat ini. Sisa bagian ini akan menggunakan istilah " properti tidak dapat diakses " dan " method tidak dapat diakses " untuk merujuk pada kombinasi deklarasi dan visibilitas .

Semua method overloading harus didefinisikan sebagai publik .

Interpretasi PHP dari " overloading " berbeda dari kebanyakan pemrograman berorientasi objek lainnya seperti java. Overloading pada umumnya memberikan kemampuan untuk memiliki beberapa method dengan nama yang sama tetapi jumlah dan tipe argumen yang berbeda.

Properti Overloading

Dalam PHP ada empat properti overloading, yaitu:
  1. public void __set ( string $name , mixed $value )
  2. public mixed __get ( string $name )
  3. public bool __isset ( string $name )
  4. public void __unset ( string $name )
Keterangan :
  1. __set() dijalankan ketika menulis data pada properti yang tidak dapat diakses.
  2. __get() digunakan untuk membaca data dari properti yang tidak dapat diakses.
  3. __isset() dipicu dengan memanggil method isset() atau empty() pada properti yang tidak dapat diakses.
  4. __unset() dipanggil saat  method unset() digunakan pada properti yang tidak dapat diakses.
Argumen $name adalah nama dari properti yang sedang diakses dan $value pada method __set() merupakannilai yang diberikan pada properti dengan nama $name.

Properti overloading hanya bekerja dalam konteks objek . Magic method ini tidak akan dipicu dalam konteks statis . Oleh karena itu methog ini tidak boleh dinyatakan sebagai static . Pada PHP 5.3.0 , peringatan akan muncul jika salah satu magic method overloading dinyatakan sebagai static .

Contoh penggunaan properti overloading dari situs php.net

 <?php  
 class PropertyTest  
 {  
   /** Location for overloaded data. */  
   private $data = array();  

   /** Overloading not used on declared properties. */  
   public $declared = 1;  

   /** Overloading only used on this when accessed outside the class. */  
   private $hidden = 2;  

   public function __set($name, $value)  
   {  
     echo "Setting '$name' to '$value'\n";  
     $this->data[$name] = $value;  
   }  

   public function __get($name)  
   {  
     echo "Getting '$name'\n";  
     if (array_key_exists($name, $this->data)) {  
       return $this->data[$name];  
     }  
     $trace = debug_backtrace();  
     trigger_error(  
       'Undefined property via __get(): ' . $name .  
       ' in ' . $trace[0]['file'] .  
       ' on line ' . $trace[0]['line'],  
       E_USER_NOTICE);  
     return null;  
   }  

   public function __isset($name)  
   {  
     echo "Is '$name' set?\n";  
     return isset($this->data[$name]);  
   }  

   public function __unset($name)  
   {  
     echo "Unsetting '$name'\n";  
     unset($this->data[$name]);  
   }  

   public function getHidden()  
   {  
     return $this->hidden;  
   }  
 }  
 echo "<pre><br/>";  

 $obj = new PropertyTest;  
 $obj->a = 1;  

 echo $obj->a . "<br/><br/>";  
 var_dump(isset($obj->a));  
 unset($obj->a);  
 var_dump(isset($obj->a));  
 echo "<br/>";  

 echo $obj->declared . "<br/><br/>";  

 echo "Let's experiment with the private property named 'hidden':<br/>";  
 echo "Privates are visible inside the class, so __get() not used...<br/>";  
 echo $obj->getHidden() . "<br/>";  
 echo "Privates not visible outside of class, so __get() is used...<br/>";  
 echo $obj->hidden . "<br/>";  
 ?>  

Jika program diatas dijalankan akan tampil :

Setting 'a' to '1'
Getting 'a'
1

Is 'a' set?
bool(true)
Unsetting 'a'
Is 'a' set?
bool(false)

1

Let's experiment with the private property named 'hidden':
Privates are visible inside the class, so __get() not used...
2
Privates not visible outside of class, so __get() is used...
Getting 'hidden'


Notice:  Undefined property via __get(): hidden in /home/sabrina/www/php/index.php on line 72 in /home/sabrina/www/php/index.php on line 31

Method Overloading

Dalam PHP ada dua method ovrloading, yaitu :
  1. public mixed __call ( string $name , array $arguments )
  2. public static mixed __callStatic ( string $name , array $arguments )
Keterangan :
  1. __call() dipicu ketika memanggil method yang tidak dapat diakses didalam object
  2. __callStatic() dipicu ketika memanggil method yang tidak dapat diakses didalam static
Argumen $name adalah nama dari method yang dipanggil dan $arguments merupakan enumerasi array yang berisi parameter yang dilewatkan pada method $name.

Contoh penggunaan method overloading

 <?php  
 class MethodTest  
 {  
   public function __call($name, $arguments)  
   {  
     // Note: value dari $name adalah case sensitive.  
     echo "Memanggil method '$name' "  
        . implode(', ', $arguments). "<br/>";  
   }  

   public static function __callStatic($name, $arguments)  
   {  
     // Note: value dari $name adalah case sensitive.  
     echo "Memanggil method '$name' "  
        . implode(', ', $arguments). "<br/>";  
   }  
 }  

 $obj = new MethodTest;  

 $obj->Jalankan('->pada konteks Object');  
 MethodTest::Jalankan('->pada konteks Static');   
 ?>  

Jika program diatas dijalankan akan tampil :

Memanggil method 'Jalankan' ->pada konteks Object
Memanggil method 'Jalankan' ->pada konteks Static

Referensi :

0 komentar

Post a Comment