使用場景:資料庫連線
首先,將該類的建構函式私有化(目的是禁止其他程式建立該類的物件);
其次,在本類中自定義乙個物件(既然禁止其他程式建立該類的物件,就要自己建立乙個供程式使用,否則類就沒法用,更不是單例);
最後,提供乙個可訪問類自定義物件的類成員方法(對外提供該物件的訪問方式)。
直白的講就是,你不能用該類在其他地方建立物件,而是通過該類自身提供的方法訪問類中的那個自定義物件。
那麼問題的關鍵來了,程式呼叫類中方法只有兩種方式,①建立類的乙個物件,用該物件去呼叫類中方法;②使用類名直接呼叫類中方法,格式「類名.方法名()」;
上面說了,建構函式私有化後第一種情況就不能用,只能使用第二種方法。
而使用類名直接呼叫類中方法,類中方法必須是靜態的,而靜態方法不能訪問非靜態成員變數,因此類自定義的例項變數也必須是靜態的。
這就是單例模式唯一例項必須設定為靜態的原因。
單例模式連線資料庫
三私一公:私有化靜態屬性,私有化構造方法,私有化轉殖方法,公有化靜態方法。
乙個單例類應具備以下特點:
單例類不能直接例項化建立,而是只能由類本身例項化。因此,要獲得這樣的限制效果,建構函式必須標記為private,從而防止類被例項化。
需要乙個私有靜態成員變數來儲存類例項和公開乙個能訪問到例項的公開靜態方法。
在php中,為了防止他人對單例類例項轉殖,通常還為其提供乙個空的私有__clone()
方法。
使用場景:只例項化一次,內部例項化,對外只有乙個開放方法,只能通過調取該方法進行調取例項化物件。資料庫連線
<?php定義常量
define("db_host", "127.0.0.1");
define("db_user", "root");
define("db_password", "root");
define("db_dbname", "dml");
class db
}資料庫連線的方法
private function conn()
連線資料庫
$conn->select_db($this->dbname);
設定字符集
$conn->set_charset("utf8");
$this->db=$conn;
}禁止轉殖
private function __clone()
例項化類操作
public static function getdb()
return self::$d;
}資料庫增刪改查操作
public function querydb($sql)
}呼叫時,先呼叫例項化類的方法
$aa=db::getdb();
$res=$aa->querydb("select * from `user`");
var_dump($res);
例子(1)
<?phpclass db
//禁止轉殖
private function __colone(){}
//由於構造方法定義為private不能使用new來例項化,所以方法只能也用static,又由於靜態方法不能用$this->conn所以屬性也靜態化了
public static function gettest()
return self::$conn;
}public static function test()
}$test1 = db::gettest();
$test2 = db::test(); //例項化第二次
$test3 = db::gettest();
var_dump($test1,$test2,$test3);
//object(db)#1 (0) object(db)#2 (0) object(db)#1 (0)
exit;
PHP單例模式
模式對於oop開發人員尤其有用,因為他有助於建立穩定的api,並且仍然保持一定的靈活度。一種模式可以幫助我們定義負責完成特定任務的物件,還可以允許我們全部修改掉某個類而不用修改與這些類打交道的 前者被稱為類的職責,後者被稱為類的多型性。單例模式被當作職責模式,他用來在應用程式中建立乙個單一的功能訪問...
php單例模式
單例模式 單例類 1 建構函式需要標記為private 訪問控制 防止外部 使用new操作符建立物件 單例類不能在其他類中例項化,只能被其自身例項化 2 擁有乙個儲存類的例項的靜態成員變數 3 擁有乙個訪問這個例項的公共的靜態方法 常用getinstance 方法進行例項化單例類,通過instanc...
php 單例模式
單例模式 身份證號碼 單例類identitycardno 身份證號碼類 class identitycardno public function getinstance else return self instance private function setidentitycardno no p...