php單例模式

MaChao發表於2020-10-27

單例模式的要點:

  • 建構函式需要標記為private(訪問控制:防止外部程式碼使用new操作符建立物件),單例類不能在其他類中例項化,只能被其自身例項化;
  • 擁有一個儲存類的例項的靜態成員變數
  • 擁有一個訪問這個例項的公共的靜態方法(常用getInstance()方法進行例項化單例類,通過instanceof操作符可以檢測到類是否已經被例項化)

簡單的記為三私一公一關鍵:

  • 私有靜態屬性(privite static $instance),又來儲存生成的唯一物件
  • 私有建構函式 (privite __contruct())
  • 私有克隆函式(privite function __clone()),防止克隆——clone
  • 公共靜態方法(public static function getInstance()),用來訪問靜態屬性儲存的物件,如果沒有物件,則生成此單例
  • 關鍵詞instanceof,檢查此變數是否為該類的物件、子類、或是實現介面。

為什麼要使用PHP單例模式?

  • php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作,** 使用單例模式, 則可以避免大量的new 操作消耗的資源。**
  • 如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現。
  • 在一次頁面請求中, 便於進行除錯, 因為所有的程式碼(例如資料庫操作類db)都集中在一個類中, 我們可以在類中設定鉤子, 輸出日誌,從而避免到處var_dump, echo。

    單例模式解決的問題

    單例模式解決的是如何在整個專案中建立唯一物件例項的問題,單例模式和工廠模式可以產生更加合理的物件。

程式碼

/**
 * @purpose: 建立一個單例類
 * Class Single
 */
class Single {
    /**
     * @var Object 儲存類例項的靜態成員變數
     */
    private static $_instance;

    /**
     * Single constructor. 私有的構造方法
     */
    private function __construct(){
        echo 'This is a Constructed method;';
    }

    /**
     * @purpose: 建立__clone方法防止物件被複制克隆
     */
    public function __clone(){
        //E_USER_ERROR只能通過trigger_error($msg, E_USER_ERROR)手動觸發。E_USER_ERROR是使用者自定義錯誤型別,可以被set_error_handler錯誤處理函式捕獲,允許程式繼續執行。E_ERROR是系統錯誤,不能被set_error_handler錯誤處理函式捕獲,程式會退出執行
        trigger_error('Clone is not allow!',E_USER_ERROR);
    }

    /**
     * @return Single|Object 單例方法,用於訪問例項的公共的靜態方法
     */
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){
            self::$_instance = new self;
        }
        return self::$_instance;
    }

    /**
     * @purpose: 測試方法
     */
    public function test(){
        echo '呼叫方法成功';
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章