標籤:io 使用 ar sp div art c on cti
Php物件導向 – 單例模式
保證類僅僅有一個執行個體
1. 怎樣能夠解決一個類能夠被無限地執行個體化?
New,就能執行個體化一次,怎麼去限制,使用者不能無限次地new?
將構造方法私人化。全部外部的new都操作失敗
class MySQLDB
{
private function __construct()
{
}
}
2. 一旦構造方法私人化,意味著類不能再類外執行個體化。但能夠在類內執行個體化。
添加一個公用的靜態方法,通過類來調用該方法,在方法內能夠運行new操作。
class MySQLDB
{
private function __construct()
{
}
public static function getInstance()
{
return new MySQLDB;
}
}
$o = MySQLDB::getInstance();
此時,使用者須要該類的對象,方法內的代碼就會運行,因此,我們能夠通過完好方法內的邏輯,限制使用者得到對象的操作。
3. 在上面的方法內,使用這種邏輯:每次運行時做推斷,推斷該類是否已經執行個體化對象,假設執行個體化了,則直接返回這個執行個體化好的對象。假設沒有執行個體化,則執行個體化一個新的,然後返回。
怎樣推斷?
在這個對象被執行個體化出來時,儲存起來。
範例:
class MySQLDB
{
private static $instance;
private function __construct()
{
}
public static function getInstance()
{
if(!self::$instance instanceof self)
{
self::$instance= new self;
}
return self::$instance;
}
}
4. 複製也能夠得到新對象,因此須要限制複製。
私人化 __clone()方法
class MySQLDB
{
private static $instance;
private function __construct()
{
}
private function __clone()
{
}
public static function getInstance()
{
if(!self::$instance instanceof self)
{
self::$instance= new self;
}
return self::$instance;
}
}
Php物件導向 – 單例模式