PHP ile OOP Serisi: Singleton Class
Belki OOP için biraz fazla ileri bir konu ama, Singleton design pattern’i oldukça gerekli olabiliyor. Pek çok arkadaşımız aslında tek instance’i olması gereken classlarını singleton yapmıyor, biryerlerde aynı object’in tek bir instance’i gerekse bile boyuna çağırıyor. Dolayısıyla PHP boşu boşuna performans kaybediyor, boşu boşuna onca sistem kaynağı gidiyor. Yazık değil mi? Ağlar o memmory blocklar sonra arkanızdan.
Konumuza dönersek, singleton class’ın özelliği kendisinden sadece bir tane çağırılabilmesidir, tıpkı class içine alınmamış geleneksel fonksiyonlar gibi.
if (!interface_exists('Singleton_Interface')) {
/**
* singleton interface - phpclasses.org'dan alinmistir, standart interface
* @author Matthieu MARY <matthieu@phplibrairies.com>
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
interface Singleton_Interface
{
/**
* singleton standardı getInstance ile alınır, öylesi hoş..
* @access public
* @static
*/
public static function getInstance();
/**
* __clone overload methodunun üstesinden gelinmeli
* exception throw edelim
*/
public function __clone();
}
}
/*
* A true singleton in PHP - phpclasses.org'dan alinmistir biraz da gelistirilmistir.
* @author Sourav Ray - GY
* @version 1.0.0
* @name singletone.class
*/
class sTonClass implements Singleton_Interface {
static $TheInstance; //singeTon'u sağlayacak degisken
public $deneme; //denemesi..
// class'ın constructor'i private, sinifin disarisindan kendisi cagirilamayacak { }
private function sTonClass() {
}
public static function getInstance() //Class'ın örneğini yaratan ayni zamanda donduren fonksyon.
{
if (sTonClass::$TheInstance == NULL) //Eger daha once bir ornegi mevcut degilse class'i yaratip dondurur.
sTonClass::$TheInstance = new sTonClass ( );
$instanceReferance = & sTonClass::$TheInstance; // Eger ornegi mevcutsa, eski ornegi dondurur
return $instanceReferance; // Eski ornegin referansi.
}
public function __clone() { throw new Exception('Bu sınıf singleton'); } //bu sınıfın clone'u olmaz.
} // bitis
//kullanim
$x = sTonClass::getInstance ();
$x->deneme = "hede";
$y = sTonClass::getInstance();
echo $y->deneme;
?>
Singleton’un ne olduğu ve kullanımı ile ilgili daha detaylı bilgi için tıklayın.
Eğer beğendiysen, belki GWG'nin RSS beslemesine kayıt olmak istersin. Ziyaretin için teşekkürler!









Bu singleton class yapısını anladım da bu getInstance(), __construct ederken çağırılırsa daha mantıklı olmaz mı? Yani class’ı sahaya sürerken illa stClass::getInstance() yerine $y=new stClass; desek ve $x=new stClass’ta yine $y’yi adreslese öyle bişey gerçekleşmez mi?
getInstance() ZF de ve daha birçok frameworkde bir Coding Standart, tabii ki new şeklinde de çağıralabilir ve instance return edilebilir. Bu singleton’u oluştururken gene bu design pattern’in diğer dillerinde kullanılışını (wiki singleton) izleyerek overload __contruct yerine class init kullandım. Bunun sebebi büyük ihtimalle __construct’da extend edilirken class’ın singleton özelliğinin aşılabiliyor oluşu; fakat bu yöntemle class init fonksiyonu, __contruct’dan sonra çağırıldığından aşılamaz oluyor oluşu olabilir. Ayrıca bir cümlede olmak fiilinde 3 strike yaptım, 2 aşmak kullandım, beynim sulanmış. evet.
:D evet biraz öyle olmuş. Ama çok ilginç bişey, basit ve güzel. biraz denemeler yapıyım..
Merhabalar,
Ben bu ‘interface’ yapısını anlayamadım.Ne için kullanılıyor bu interface?
Interface, bir sınıfın çıplak methodlarını içeren yalın biçimleridir. Bir sınıfın methodları, interface’leri sayesinde kolayca tanınabilir, ve içeriği çeşitli interfaceler kullanılarak gruplanabilir. Bir sınıfa bir interface tanımlanıyorsa, tanımlandığı sınıf mutlaka, interface’in methodlarını içermelidir. Ayrıca kullanım amacının gereği sınıfın kendi içinde kullandığı private fonksiyonlar, interfacelerin içinde bulunmazlar, diğer bir değişle interface’in sahip olduğu bütün methodlar public olma zorunluluğu taşır, yoksa bir fatal error’le başbaşa kalırsınız. Bir interface, aynı zamanda birden fazla sınıfa atanabilir, genel olarak kullanım amacı da budur; bu yüzden birden çok singleton sınıfı olacağından, bir de örnek interface ekleme gereği duydum.