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 🙂