2 回答

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

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