由php的單例模式到php對象的建立方式

最近去面試,遇到一個單例模式的問題,思考一些之前沒想到的東西,給你們分享下。 php是以進程的方式運行的,咱們忽略多線程的問題,不用給屬性加鎖。經常使用的單例模式類。 單例模式運行的場景,有時咱們可能在一個進程裏面某一個類只有一個實例運行。 經常使用的單例模式是這麼寫的。 class SingleClass{ private static $instance = null; //構造方法 private function __construct(){ echo " new obj"; } //獲取實例 public static function getInstance(){ if(empty(self::$instance)){ self::$instance = new self(); } return self::$instance; } } //$sc = new SingleClass();//報錯 $sc = SingleClass::getInstance();//建立單例模式php

看起來是沒什麼問題,但是若是咱們clone呢? (對象複製能夠經過 clone 關鍵字來完成) $sc2 = clone $sc;//clone 了一個新的對象 var_dump($sc,$sc2); 輸出: new objclass SingleClass#1 (0) { } class SingleClass#2 (0) { } 同一個進程下這個類實際上產生了新的對象,面試

怎麼樣避免這個問題呢。多線程

class SingleClass{ private static $instance = null; //構造方法 private function __construct(){ echo " new obj"; } //獲取實例 public static function getInstance(){ if(empty(self::$instance)){ self::$instance = new self(); } return self::$instance; }線程

private function __clone(){
	echo "clone";
}

} //$sc = new SingleClass();//報錯 $sc = SingleClass::getInstance();//建立單例模式 $sc2 = clone $sc;//clone 了一個新的對象 //var_dump($sc,$sc2); 這時運行代碼會報錯。 new objPHP Fatal error: Call to private SingleClass::__clone() from context '' in /Users/kang/Documents/phpProject/test/test.php on linecode

這纔是php中較好的單例模式。對象

這個問題的本質是什麼呢?php建立對象的方式。 php對象在php源碼裏面的表示方式見源碼 php建立對象的方式,上面已經講過了。 1 new classname(); 2 clone object 第三種呢,經過反射進程

$reflect = new ReflectionClass($sc); $method = $reflect->getMethod("getInstance"); var_dump($method->invoke($sc));get

相關文章
相關標籤/搜索