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;
}
}