PHP Design Pattern – Singleton Pattern – Yalnızlık Tasarım Şablonun
Eğer bir sınıftan sadece bir tane nesne oluşturulacak ve bu nesne tüm sistem kullanılacak ise yalnızlık tasarım şablonu kullanır. Bununla ilgili verilecebilecek en iyi soyut örnek Tanrı Sınıfdır. Tanrı sınıfından sadece bir tane üretebiliriz çünkü tanrı tektir.
Daha somut bir örnek ile kodumuzu yazalım. Yalnızlık tasarım şablonu daha ziyade veritabanına bağlatılarda kullanılaiblir. Basit bir kod ile örnek verelim. Birinci örneğimiz PHP|Architect’s grubunun çıkardığı “Zend PHP 5 Certification Study Guide” kitabından alıntıdır.
class DB {
private static $_singleton;
private $_connection;
private function construct()
{
$this->_connection = mysql_connect();
}
public static function getInstance()
{
if ( is_null( self::$_singleton ) )
{
self::$_singleton = new DB();
}
return self::$_singleton;
}
}
$db = DB::getInstance();
3 ve 4 Satırlar
private static $_singleton;
private $_connection;
Üçüncü satırda Singleton sınıfından yaratılacak tek nesneyi private ve statik değişken olarak $_singleton sınıfına atadık. Dördüncü satırda ise $_connection değişkenini private olarak tanımladık. Her iki değişken sadece DB sınıfı tarafından değiştirilebilir.
6 – 9 Satır Aralığı
private function construct()
{
$this->_connection = mysql_connect();
}
DB sınıfının yapılandırıcısının (=construct) yalnızlık (=singleton) tasarım şablonunda erişilmez olması gerekmektedir. O yüzden private yapılır. Bunun nedeni methodun yapılandırıcısının sadece kendi içinden çalıştırılması yatar. Burada yapılandırıcı mysql_connect() fonksiyonunu private _connection değişkenine atıyor.
11 – 19 Satır Aralığı
public static function getInstance()
{
if ( is_null( self::$_singleton ) )
{
self::$_singleton = new DB();
}
return self::$_singleton;
}
getInstance methodu yalnızlık (=singleton) tasarım şablonundan oluşturlulabilecek tek nesneye ulaşmak için kullanılıyor. is_null fonksiyonu ile $_singleton değişkenine bir değer atanıp atanmadığını kontrol ediyor. Eğer atama yoksa new BD() ; sınıfını oluşturarak atamayı yapıyor ve $_singleton değişkenini döndürüyor.
23 üncü Satır
$db = DB::getInstance();
Son olarak $db değişkenine yalnızlık tasarım şablonundan elde ettiğimiz tek neslenin yüklenmesi kalmıştır. getInstance() methodu statik bir method olduğundan new DB(); ifadesi ile ynei bir nesne oluşturmadan direk :: ifadesi ile erişilebilir.
Yalnızlık Tasarımının Bazı Özellikleri
- Sınıfın yapılandırıcısı private olmalıdır. Bunun mantığı bu sınıftan new operatörü ile nesneler üretemezsiniz.
- Bu sınıftan tek bir nesne üretileceği için üretilecek nesneyi sınıfa static ve private özelliği ile değişken olarak tanımlamak gerekmektedir.
- Bu sınıfta statik olarak tanımlanmış nesneyi geri vermeye yarıyacak satatik bir method olmalıdır. Bu methoda genellikle getInstance(); instance() methodu ismi verilir.
Bir kaç uyarı
Yukarıdaki kod bloğu belki size Zend Sertifakasını getirir ama kendi içinde bir güvenlik açığı barındırmaktadır. Tanrı Sınıfından sadece bir tane tanrı nesnesi yaratabildiğimize göre bu nesnenin _clone() ve _wakeup() methodları ile kopyalanmasını engellememiz gerekmektedir. Bunun için aşağıdaki kod bloğununda sınıfa eklenmesi gerekmektedir. İsterseniz methodların içlerini boş bırakabilirsiniz.
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
public function __wakeup()
{
trigger_error('Deserializing is not allowed.', E_USER_ERROR);
}
Eğer PHP programcısıysanız yalnızlık tasarım şablonu ile bilmeniz gerekenler bu kadardır. JAVA programcısıysanız çoklu kanal için ayrı bir kod eklemeniz gerekmektedir. Bu başka bir konudur ve bu yazının içeriğine girmez.
October 3, 2009 at 11:23 pm | admin
Türkçe karakterleri bir test edelim bakalım. Malum başlıklarda çıkmıyor. Ah ah substr() fonksiyonu ah.
ĞÜŞİÖÇ ğüşiöçı
October 5, 2009 at 10:58 am | Kıvanç Çiftçi
dostum türkçe karakterlerde problem olmaması için mb_substr() fonksiyyonunu kullanabilirsin. mb_substr($string, $i, $j, “utf-8″); gibi.