2 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
單例的作用是保證在類被調(diào)用的時(shí)候只被實(shí)例化一次
并且每次調(diào)用的都是該被實(shí)例化的類
作用可以思考,一個(gè)數(shù)據(jù)庫(kù)鏈接,在一次訪問中只需要一個(gè)數(shù)據(jù)庫(kù)鏈接,并不應(yīng)該產(chǎn)生多個(gè)數(shù)據(jù)庫(kù)鏈接
實(shí)現(xiàn)的方式是通過(guò)聲明一個(gè)靜態(tài)變量,用來(lái)存儲(chǔ)唯一的實(shí)例化對(duì)象
類被調(diào)用的方式不是童工new的實(shí)例化調(diào)用,為了保證不在外部被實(shí)例化,所以需要將__construct()實(shí)例化函數(shù)設(shè)置為私有或者子類繼承,通過(guò)統(tǒng)一的調(diào)用接口調(diào)用,在你的例子里面就是getlns
該函數(shù)中判斷了靜態(tài)變量是否是滿足自身的接口設(shè)定,不滿足則實(shí)例化自己
你的代碼在return $this->data[$key];這句應(yīng)該是錯(cuò)誤的
整個(gè)getlns應(yīng)該改為如下
public static function getIns(){
if(!self::$ins instanceof self ){
self::$ins = new self():
}
return self::$ins;
}
你估計(jì)是寫錯(cuò)了函數(shù),你可以發(fā)現(xiàn)你的getlns中沒喲$key變量,但內(nèi)部卻調(diào)用了,所以你應(yīng)該再檢查下你寫的代碼

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
單例類只能被其自身實(shí)例化。要獲得這樣的一種結(jié)果, __construct()方法必須被標(biāo)記為private。如果試圖用private構(gòu)造函數(shù)構(gòu)造一個(gè)類,就會(huì)得到一個(gè)可訪問性級(jí)別的錯(cuò)誤。
要讓單例類起作用,就必須使其為其他類提供一個(gè)實(shí)例,用它調(diào)用各種方法。單例類不會(huì)創(chuàng)建實(shí)例副本,而是會(huì)向單例類內(nèi)部存儲(chǔ)的實(shí)例返回一個(gè)引用。結(jié)果
是單例類不會(huì)重復(fù)占用內(nèi)存和系統(tǒng)資源,從而讓應(yīng)用程序的其它部分更好地使用這些資源。作為這一模式的一部分,必須創(chuàng)建一個(gè)空的私有__clone()方
法,以防止對(duì)象被復(fù)制或克隆。
返回實(shí)例引用的這個(gè)方法通常被命名為getTnstance()。這個(gè)方法必須是靜態(tài)的,而且如果它還沒有實(shí)例化,就必須進(jìn)行實(shí)例化。getInstance() 方法通過(guò)使用 instanceof 操作符和self 關(guān)鍵字,可以檢測(cè)到類是否已經(jīng)被實(shí)例化。
/* 例子:數(shù)據(jù)庫(kù)連接職責(zé)的集中控制 */
class Database { private $_db ; static $_instance ; private function __construct() { $this ->_db = pg_connect( 'dbname=example_db' ); } private __clone() {}; public static function getInstance() { if ( ! (self:: $_instance instanceof self) ) { self:: $_instance = new self(); } return self:: $_instance ; } public function query( $sql ) { // 使用 $this->_db 執(zhí)行一個(gè)查詢 return pg_query( $this ->_db, $sql ); } } |
這個(gè)代碼可以正常進(jìn)行查詢之類的
$db =Database::getInstance(); $db ->query( $sql ); |
- 2 回答
- 0 關(guān)注
- 151 瀏覽
添加回答
舉報(bào)