PHP: Singleton Pattern

Amaç:

Bir classtan sadece bir instance(obje) oluşturulması.

Gerçek hayattan örnekler:

  • Bir bilgisayarda bir tane mouse cursor’ı olmalı.
  • Her bilgisayar ağ üzerinde bir tane internet bağlantısına ihtiyaç duyar. (Diğer bilgisayarlar aynı bağlantıyı kullanır, yeni bağlantı oluşturulmaz)

Nasıl yapacağız:

Öncelikle dışarıdan yeni obje üretimi engellememiz gerekiyor. Bunun için class’ın constructor’ını  private yapıyoruz. Kullanıcıların(programcı veya kendiniz) class’a ulaşmaları için static method belirliyoruz. Static method objeye ait değildir class’a aittir. Bu yüzden adı üstünde statiktir.

Örnek (veritabanı bağlantısı):

Bir web sayfamız olduğunu düşünelim, 4 kere require_once çağırıyor. ve çağırdığı her dosya veritabanı bağlantısı kuruyor. Gereksiz yere 4 tane veritabanı bağlantısı kurmuş oluyoruz bu durumda. 1 tane kurarak hepsini onun üzerinden yapmamız gerekiyor. Aşağıdaki örnekte sadece 1 tane PDO objesi yaratılıyor.

class SingletonDB {
    private static $instance;
    private function __constructor() {}
    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new PDO('mysql:host=localhost;dbname=test',"root","şifre");
        }
        return self::$instance;
    }
}

Çağırılış şekli: Static fonksiyonlar objeye ait olmadıkları için obje ismiyle değil class ismiyle çağırılırlar.

$db = SingletonDB::getInstance();
$stmt = $db->prepare("SELECT * FROM liste WHERE id = ?");
$stmt->execute(array(1));
$sonuc = $stmt->fetchAll();
print_r($sonuc);

gibi 🙂  

One thought on “PHP: Singleton Pattern

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax