Implementasi design pattern Singleton di PHP

Oke, udah lama nih ga nulis di blog karena lagi sibuk kuliah dan praktik lapang.
Nah kali ini saya mau nulis tentang salah satu implementasi design pattern yaitu Singleton.
Pattern ini bertujuan untuk membuat objek dan memastikan bahwa objek dari suatu class yang hidup hanya ada satu saja.
Keuntungan dari pattern ini yaitu reusability suatu objek yang pernah dibuat sebelumnya. Selain itu memori yang digunakan juga menjadi lebih hemat karena hanya ada satu objek dari class tersebut.

Berikut contoh kode program yang menggunakan pattern Singleton di PHP5:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class MysqlClient
{
    // properti untuk menyimpan instance saat ini
    protected static $instance = null;
 
    protected static $options = array(
        'user'    => '',
        'host'    => 'localhost:3306',
        'pass'    => '',
        'dbname'  => ''
    );
 
    protected $connection = null; //buat nyimpen koneksi
 
    protected function __construct()
    {
        if(($conn = mysql_connect(self::$options['host'], self::$options['user'] , self::$options['pass'])) !== false)
        {
            $this->connection = $conn;
            mysql_select_db(self::$options['db'], $conn);
        }else
            throw new Exception('Tidak dapat menyambungkan ke database');
    }
 
    public static function setOptions(array $options)
    {
        foreach($options as $key => $value){
            self::$options[$key] = $value;
        }
    }
 
    public static function getInstance()
    {
        if(self::$instance === null){
            self::$instance = new self;
        }
 
        return self::$instance;
    }
 
    public function query($sql)
    {
        return mysql_query($sql, $this->connection);
    }
}
 
//$db = new MysqlClient(); //ERROR, karena konstruktor bersifat protected
 
$options = array('user' => 'userdb', 'pass' => 'userpass', 'host' => 'localhost', 'db'=> 'dbname');
 
MysqlClient::setOptions($options);
$db = MysqlClient::getInstance();
 
print_r( $db );

Kalo kita liat contoh kode program di atas, konstruktor class MysqlClient memiliki modifier protected sehingga konstruktor tersebut tidak bisa diakses dari luar. Sehingga kita tidak bisa membuat objek dengan cara yang umum digunakan new
Di sinilah peran method MysqlClient::getInstance(). Method ini berfungsi untuk mendapatkan objek dari class MysqlClient. Class MysqlClient memiliki protected static variable$instance; dengan nilai awal null. Jadi saat class tersebut diload maka nilai $instance = null. Variabel tersebut berfungsi untuk menyimpan objek yang hidup saat ini. Karena sifatnya yang protected static maka variabel ini bersifat global dan menjadi milik class MysqlClient bukan object dari class tersebut serta hanya bisa diakses dari dalam class tersebut.

Saat method getInstance() dipanggil, akan dicek apakah sudah ada objek yang sudah dibuat, bila tidak maka akan dibuat object yang baru kemudian objek tersebut akan disimpan di MysqlClient::$instance; dan bila sudah ada objek yang pernah dibuat maka method tersebut akan mengembalikan objek yang ada di variabel MysqlClient:$instance.

Oke cukup sekian dulu tulisan kali ini. Semoga bermanfaat.


Related Contents


2 Responses to “Implementasi design pattern Singleton di PHP

  • 1
    cwicaksono
    February 5th, 2010 10:17

    mas nanya dong klo

    self::$options

    itu sama gak sih kaya

    self->$options

  • 2
    syabac
    February 5th, 2010 13:31

    beda..
    tanda -> untuk akses method atau property dari suatu object.
    sedangkan tanda :: untuk akses static method atau property dari suatu class.

    self::$options sama aja dengan seperti ClassName::$options tapi diakses dari dalam class itu sendiri..
    semoga membantu.

Leave a Reply