30 Nisan 2013 Salı

PHP - singleton pattern vs clone

    Class Test{         /**  	 * Örnek Değişken  	 */  	public $sampleVariable = NULL;    	/**  	 * Singelton bir yapı kullanılmaktadır  	 * @var Preferences  	 */  	private static $_instance;         /**  	 * Singelton yapıyı desteklemek için private constructor yarattım içi boş.  	 */  	private function __construct(){    	}    	/**  	 * Singelton yapıyı destekleyen getInstance metodu  	 * @return Test  	 */  	public static function getInstance(){  		if (self::$_instance == null) {  			self::$_instance = new Test();  		}  		return self::$_instance;  	}  }  
Yukarıdaki kod basitçe bir singleton mimariyi gösteriyor. Burada ben
 $test = new Test() 
yaratamıyorum. Çünkü constructor method'un erişilebilirliği "private" olarak belirlenmiş. Yani ancak bu sınıfı
$test = Test::getInstance() 
diyerek kullanabilirim. Peki gelin görün ki, unuttuğumuz bir şey var. Php'de "clone" diye bir obje kopyalama özelliği var. Nedir bu?
  $a = new stdClass();  $k = $a;  
dediğimizde, $a->var = 5 dediğimizde, $k da aynı şekilde değişiyor. yani bu ikisi aynı objeyi işaret ediyor. Ancak
  $a = new stdClass();  $k = clone $a;  
Yazdığımızda ise, artık $k, $a nın en son halinden kopyalanıp yeni bir obje olarak oluşturuluyor. Yani ben ilk örnekte,
$test = Test::getInstance();
yazdıktan sonra bir yerlerde $anotherTest = clone $test; dersem, artık yeni bir obje türetebilmiş oluyorum. Buyrun deneyin :
  $test = Test::getInstance();  $anotherTest = clone $test;    $test->sampleVariable = 5;  $anotherTest->sampleVariable = 10;    var_dump($test);  var_dump($anotherTest);  
Birbirinin aynısı olmayan, aynı objenin farklı 2 instance'ını singleton mimaride de yapabilmiş oldum. Sonuç : Demek ki, PHP de singleton mimarisi güvenilir değildir. Yine de güzel bir design patterni olarak beğeniyorum. Ancak bilinçli kullanmanızı tavsiye ederim. Devamı için : PHP - singleton pattern vs clone

Hiç yorum yok:

Yorum Gönder

Yorumunuzu esirgemeyiniz..