說來慚愧,用php時間也不短了,居然一直不知道__clone成員方法的存在。
今天遇到,突然想起,我以前寫得單例模式,有問題了!
單例模式類**:
<?php測試**如下:class testsingleton
static public function instance()
return self::$testsingleton;
} // private function __clone()
public function setsinvar ($sinvar)
public function getsinvar()
}
<?php輸出結果:require_once './testsingleton.php';
$singletonobj_a = testsingleton::instance();
$singletonobj_b = testsingleton::instance();
$singletonobj_c = clone $singletonobj_b;
$singletonobj_a->setsinvar('singletonobj_a');
$singletonobj_b->setsinvar('singletonobj_b');
$singletonobj_c->setsinvar('singletonobj_c');
echo $singletonobj_a->getsinvar()."\n";
echo $singletonobj_b->getsinvar()."\n";
echo $singletonobj_c->getsinvar()."\n";
create singleton object now!說明,用clone之後,原來的單例模式**,其實是可以程式設計多例的!!singletonobj_b
singletonobj_b
singletonobj_c
不幸中的萬幸,沒有用過clone,所以bug沒有脫穎而出。
正確的辦法就是把前面單例類的注釋去掉,覆寫乙個私有的clone類,可以杜絕clone。
php中的單例模式
單例類 1 建構函式需要標記為 private 訪問控制 防止外部 使用 new操作符建立物件 單例類不能在其他類中例項化,只能被其自身例項化 2 擁有乙個儲存類的例項的靜態成員變數 3 擁有乙個訪問這個例項的公共的靜態方法 常用 getinstance 方法進行例項化單例類,通過 instance...
php中的單例模式
單例模式可以說是物件導向語言裡最常用 也是最簡單的一種模式。譯文單就是 單個例項,單個物件的意思,就是說我們去例項化乙個類的時候 不管呼叫多少次,都永遠只有乙個 例項,不會有多個,這樣就節省了記憶體分配開支。先簡單說下 單例模式的原理 將建構函式 construct設定為私有的 private,對外...
php中的單例模式
最近在讀 php物件導向 模式與實踐 一書,正好讀到了設計模式的相關章節,感覺需要整理下自己的學習內容,所以準備寫寫筆記,就當鞏固和複習了。今天我們先從最簡單的模式 單例模式開始。首先,我們需要知道,什麼是單例模式?定義 生成乙個且只生成乙個物件例項的特殊類。其次 單例模式有哪些使用場景?什麼地方會...