PHP單例模式中的clone陷阱(原創)

2022-07-18 17:48:12 字數 1119 閱讀 7569

說來慚愧,用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!

singletonobj_b

singletonobj_b

singletonobj_c

說明,用clone之後,原來的單例模式**,其實是可以程式設計多例的!!

不幸中的萬幸,沒有用過clone,所以bug沒有脫穎而出。

正確的辦法就是把前面單例類的注釋去掉,覆寫乙個私有的clone類,可以杜絕clone。

php中的單例模式

單例類 1 建構函式需要標記為 private 訪問控制 防止外部 使用 new操作符建立物件 單例類不能在其他類中例項化,只能被其自身例項化 2 擁有乙個儲存類的例項的靜態成員變數 3 擁有乙個訪問這個例項的公共的靜態方法 常用 getinstance 方法進行例項化單例類,通過 instance...

php中的單例模式

單例模式可以說是物件導向語言裡最常用 也是最簡單的一種模式。譯文單就是 單個例項,單個物件的意思,就是說我們去例項化乙個類的時候 不管呼叫多少次,都永遠只有乙個 例項,不會有多個,這樣就節省了記憶體分配開支。先簡單說下 單例模式的原理 將建構函式 construct設定為私有的 private,對外...

php中的單例模式

最近在讀 php物件導向 模式與實踐 一書,正好讀到了設計模式的相關章節,感覺需要整理下自己的學習內容,所以準備寫寫筆記,就當鞏固和複習了。今天我們先從最簡單的模式 單例模式開始。首先,我們需要知道,什麼是單例模式?定義 生成乙個且只生成乙個物件例項的特殊類。其次 單例模式有哪些使用場景?什麼地方會...