PHP 單件模式
對一些類來說,,只有一個實例是很重要的。比如一個數(shù)據(jù)庫連接類實例,。我們怎么樣才能保證一個類只有一個實例并且這個實例易于被訪問呢,?一個全局變量 使得一個對象可以被訪問,但它不能防止你實例化多個對象,,而且全局變量會帶來意想不到的麻煩,。一個更好的辦法是,讓類自身負責(zé)保存它的唯一實例,。這個類可 以保證沒有其他實例可以被創(chuàng)建(通過截取創(chuàng)建新對象的請求),,并且它可以提供一個訪問該實例的方法。這就是Singleton模式:保證一個類僅有一個實例,,并提供一個訪問它的全局訪問點,。
請看下面一段代碼,一個數(shù)據(jù)庫連接類:
view plaincopy to clipboardprint? <?php class DbConn { // 私有靜態(tài)變量,保存DbConn類唯一實例 private static $instance; // 私有的構(gòu)造函數(shù),防止用戶直接實例化DbConn類 private function __construct() { // 這里初始化數(shù)據(jù)庫連接 } // 公有的靜態(tài)方法,獲取DbConn類的唯一實例 public static function getInstance() { if (!isset(self::$instance)) { self::$instance = new DbConn(); } return self::$instance; } // 私有的析構(gòu)函數(shù) private function __destruct() { // 這里關(guān)閉數(shù)據(jù)庫連接 } // 阻止用戶克隆DbConn類實例 public function __clone() { trigger_error('不允許Clone.', E_USER_ERROR); } ?> <?php class DbConn { // 私有靜態(tài)變量,保存DbConn類唯一實例 private static $instance;
// 私有的構(gòu)造函數(shù),防止用戶直接實例化DbConn類 private function __construct() { // 這里初始化數(shù)據(jù)庫連接 } // 公有的靜態(tài)方法,獲取DbConn類的唯一實例 public static function getInstance() { if (!isset(self::$instance)) { self::$instance = new DbConn(); } return self::$instance; } // 私有的析構(gòu)函數(shù) private function __destruct() { // 這里關(guān)閉數(shù)據(jù)庫連接 } // 阻止用戶克隆DbConn類實例 public function __clone() { trigger_error('不允許Clone.', E_USER_ERROR); } ?>
分析一下這段代碼,發(fā)現(xiàn)4個特征: 1.一個私有的靜態(tài)屬性 2.私有的構(gòu)造,、析構(gòu)函數(shù) 3.一個公有的靜態(tài)方法獲取類的唯一實例 4.防止用戶克隆(__clone())類實例
這就是Singleton模式的特征,,一個非常高效實用的模式。
下面一段代碼是測試例子,。
view plaincopy to clipboardprint? <?php // 報錯 $test = new DbConn(); // OK $test = DbConn::getInstance(); // 報錯 $test_clone = clone($test); ?> |
|