[ Normal ]

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:
class Options {

    public $six = '6 (from class)', $seven = '7 (from class)';
    private $options;

    public function __construct(&$options = array()) {
        $this->options = &$options;
    }

    public function __set($name, $value) {
        array_key_exists($name, $this->options) or $this->options[$name] = $value;
    }

    public function &__get($name) {
        return $this->options[$name];
    }

}


Kita siapkan array berikut:
$options = array(
    'one'   => '1 (from array)',
    'two'   => '2 (from array)',
    'three' => '3 (from array)',
    'four'  => '4 (from array)',
);

Buat object dengan memasukkan array diatas:
$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):

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


Property-property berikut TIDAK tersedia di class dan akan menginisiasi __get() pada class:
echo $o->three; // 3 (from array)
echo $o->four; // 4 (from array)


Property berikut TIDAK tersedia di class, dengan melakukan assignment akan menginisiasi __set():
$o->five = '5 (new)';
print_r($options);
/*
Array
(
    [one] => 1 (from array)
    [two] => 2 (from array)
    [three] => 3 (from array)
    [four] => 4 (from array)
    [five] => 5 (new)
)
*/


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