PHP Deklarasi Property Secara Dinamis (Bagian 2)

Di PHP terdapat magic methods yang akan dijalankan ketika mengakses atau meng-set (assignment) suatu property yang tidak terdeklarasi ataupun visible pada scope saat ini, yaitu __get() dan __set(). Hal ini berguna untuk deklarasi atau membuat property-property secara dinamis, disebut overloading. Perlu diingat bahwa konsep overloading di PHP berbeda dengan overloading di bahasa pemrograman lain seperti C++. Perlu diingat juga bahwa semua method overloading harus didefinisikan sebagai public.

Perhatikan class berikut, argumen class ini berupa array:

  1. class Options { 
  2.  
  3.     public $six = '6 (from class)', $seven = '7 (from class)'; 
  4.     private $options; 
  5.  
  6.     public function __construct(&$options = array()) { 
  7.         $this->options = &$options; 
  8.     } 
  9.  
  10.     public function __set($name, $value) { 
  11.         array_key_exists($name, $this->options) or $this->options[$name] = $value; 
  12.     } 
  13.  
  14.     public function &__get($name) { 
  15.         return $this->options[$name]; 
  16.     } 
  17.  
  18. } 

Kita siapkan array berikut:

  1. $options = array( 
  2.     'one'   => '1 (from array)', 
  3.     'two'   => '2 (from array)', 
  4.     'three' => '3 (from array)', 
  5.     'four'  => '4 (from array)', 
  6. ); 

Buat object dengan memasukkan array diatas:

  1. $o = new Options($options); 

Pada method __set(), jika property tidak ditemukan di class, maka masukkan ke array, namun jika nama property (key) belum ada di array. Pada method __get(), jika property tidak ditemukan di class, maka ambil dari array.

Property-property berikut tersedia di class dan visible (public):

  1. echo $o->six; // 6 (from class) 
  2. echo $o->seven; // 7 (from class) 

Property-property berikut TIDAK tersedia di class dan akan menginisiasi __get() pada class:

  1. echo $o->three; // 3 (from array) 
  2. echo $o->four; // 4 (from array) 

Property berikut TIDAK tersedia di class, dengan melakukan assignment akan menginisiasi __set():

  1. $o->five = '5 (new)'; 
  2. print_r($options); 
  3. /* 
  4. Array 
  5. ( 
  6.     [one] => 1 (from array) 
  7.     [two] => 2 (from array) 
  8.     [three] => 3 (from array) 
  9.     [four] => 4 (from array) 
  10.     [five] => 5 (new) 
  11. ) 
  12. */ 

Artikel ini adalah lanjutan dari: PHP Deklarasi Property Secara Dinamis (Bagian 1).