最近在看php高級程序設計、模式、框架與測試一書,頗有感悟,與大家分享:
在做項目時,通常我們希望某些類實例一次就夠了,比如共用配置類,模板操作類,數據庫連接等等,這些類因為在整個項目開發中是通用的,如果實例多次實例就會占用資源.
為了達到這種目的,必須保證整個項目有且只有一個實例存在並提供一個訪問點供全局訪問。這就需要通過調用此類的一個共用靜態方法來訪問這個實例,也就是說此類不能在類外面去實例化,只能在類內部實例,而且是只能通過共用的靜態方法調用實例;
那麼怎麼保證此類不能在外面實例化呢?需要此單例類必須擁有一個構造函數__construct,且設置為private(因為已經有__construct,不考慮默認的構造方法:直接用類名的方法的情況),這樣就保證了不會在外面直接實例化!同時還需要聲明一個靜態方法變量來保存此類的實例,一個共用的靜態方法來訪問此實例,(因為要共用,所以聲明為靜態的,存放內存中的共用代碼區部分)。還需要創建一個空的私有的__clone()方法,以防止被克隆。
一個很典型的單例類如下:
代碼如下 復制代碼class Simple
{
/**
* 單例類實例
*
* @static
* @var object Simple
*/
public static $_instance;
//其他成員變量
/**
* 構造方法
*
* @return void
*/
private function __construct()
{
//寫構造方法
}
/**
* 單例模式調用方法
*
* @static
* @return object Template
*/
public static function getInstance()
{
if (!self::$_instance instanceof self)
self::$_instance = new self();
return self::$_instance;
}
/**
* 聲明一個空的私有克隆方法
*
*/
private function __clone()
{
}
//其他方法
}
//調用方式
$Simple = Simple::getInstance();
?>
上面用到了 instanceof關鍵字,為比較操作符,返回布爾能夠判斷某個對象實例是否為制定的類型,或者是否從某個類繼承,或者是否實現了某個特定接口