php設計模式-單例模式


PHP單例模式

定義:簡單的說,整個應用中只有一個實例對象的設計模式

1、單例模式的要點:

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

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

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

2、為什么要使用PHP單例模式?

  • php的應用主要在於數據庫應用, 所以一個應用中會存在大量的數據庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
  • 如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現。
  • 在一次頁面請求中, 便於進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鈎子, 輸出日志,從而避免到處var_dump, echo。

3、單例模式解決的問題

單例模式解決的是如何在整個項目中創建唯一對象實例的問題,單例模式和工廠模式可以產生更加合理的對象。

/**
 * @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 '調用方法成功';
    }
}

 

 

 

本文參考自博友的博客,感謝博友的分享:https://www.cnblogs.com/zhhtao/p/4821140.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM