PHP設計模式之單例模式
阿新 • • 發佈:2020-11-16
前言
PHP設計模式多達23種,但常用的就幾種,今天就介紹一下其中常用的。
常用的設計模式有三種:單例模式、工廠模式(普通工廠、抽象工廠)
什麼叫單例模式
單例模式:建立類的唯一例項
為什麼要使用單例模式
1.一個php資料庫對外連線是有限的,一般一千個。一個應用中會存在大量的資料庫操作,在使用面向物件的方式開發時(廢話), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源(我所瞭解的)
簡單來說就是可以只建立一次資料庫連線例項
2.如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現. 這個可以參看zend framework的FrontController部分。
3. 在一次頁面請求中, 便於進行除錯, 因為所有的程式碼(例如資料庫操作類db)都集中在一個類中, 我們可以在類中設定鉤子, 輸出日誌,從而避免到處var_dump, echo。
如何建立單例
為了防止在類外例項化多個物件
1.構造方法私有化
2.防止克隆物件,私有化克隆方法
3.提供內部例項化
1 namespace demo1; 2 3 class Demo{ 4 // 1.私有化構造方法 5 private function __construct(){ 6 7 } 8 9 // 2.提供內部例項化 10 private static$instance = null; 11 public static function getInstance(){ 12 if(is_null($instance)){ 13 self::$instance =new self(); 14 } 15 return $instance; 16 } 17 18 // 3.防止克隆物件,私有化克隆化方法 19 private function __clone(){} 20 } 21 } 22 23 //獲取當前唯一例項 24 $demo1 = Demo::getInstance();
實用場景(資料庫連線單例模式)
namespace Demo2; class Db{ // 1.例項化構造方法 private function __construct(...$connectParams){ list($dsn,$username,$password) = $connectParams; self::$pdo = new \PDO($dsn,$username,$password); } // 2.內部例項化 private static $pdo = null; public static function getInstance(...$connectParams){ if(is_null(self::$pdo)){ new self(...$connectParams); } return self::$pdo; } // 3.防止克隆 private function __clone(){} } // 例項化 $connectParams = ['mysql:host=localhost;dbname=php_test','root','root']; $pdo=Db::getInstance(...$connectParams);
$pdo1=Db::getInstance(...$connectParams);
// 驗證
var_dump($pdo === $pdo1);