1. 程式人生 > 實用技巧 >PHP設計模式之單例模式

PHP設計模式之單例模式

前言

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