Anasayfa | Giriş Yapın | Üye Olun | Gökçe Kim? | İletişim
Gökçe’nin Web Güncesi (gwg)

Gökçe’nin Web Güncesi (gwg)

If you want to hide ‘things’, The Web is not the place.

Gökçe’nin Web Güncesi (gwg) RSS Feed
 
 

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.


< ?php

if (!interface_exists('Singleton_Interface')) {
/**
* singleton interface - phpclasses.org'dan alinmistir, standart interface
* @author Matthieu MARY
* @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.

7 Yorum - “PHP ile OOP Serisi: Singleton Class”

  1. 1
    Taha Paksu:

    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?

  2. 2
    Gökçe YALÇIN:

    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.

  3. 3
    Taha Paksu:

    :D evet biraz öyle olmuş. Ama çok ilginç bişey, basit ve güzel. biraz denemeler yapıyım..

  4. 4
    Ali Gedik:

    Merhabalar,

    Ben bu ‘interface’ yapısını anlayamadım.Ne için kullanılıyor bu interface?

  5. 5
    Gökçe YALÇIN:

    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.

  6. 6
    ikizmaz:

    evet güzel bir konu bu. bu konuyu genişletmenizi isterdim.yazıda basettiğiniz singleton ve ek olarak bir kaçtane daha önemli design pattern var onlarıda ele alırsanız çok faydalı olacaktır. teşekkürler

  7. 7
    Ali Gedik:

    Bilgi için teşekkürler.

Bir cevap bırakın