首頁  >  文章  >  後端開發  >  PHP單例模式定義與使用實例詳解

PHP單例模式定義與使用實例詳解

墨辰丷
墨辰丷原創
2018-05-26 14:00:461475瀏覽

這篇文章主要介紹了PHP單例模式定義與使用,結合具體資料庫操作類別的形式較為詳細的分析了php單例模式的功能、定義、使用方法與相關注意事項,需要的朋友可以參考下

具體如下:

先簡單的介紹一下單例模式。 單例模式就是在應用程式中保持某一個類別實例只存在一個,而且不可以受外部環境的影響而產生這個類別的第二個實例。它的優點,實際點見,如果在WEB開發中,保持單一個資料操作類別實例的存在,可以減少不必要的多餘連接資料庫資源的消耗,對於大型的軟體開發來說,可以使用單例來維持程式的狀態,使不同操作實現同步,因為單例一直佔據內存,而從不會有副本。

而對於PHP,使用單例最常用的場合莫過於寫一個資料庫操作類別。不過在PHP中實作單例,有以下規則:

1)單例類別必須擁有一個現行宣告的建構函數,並且是私有的。

2)單例類別必須有一個靜態變數來儲存類別的實例,這樣可以保持這個單例類別就只有那麼一個實例。

3)單例類別必須提供一個靜態方法,供其他所有的物件應用這個單例。

為什麼要滿足以上三個條件呢:

1)因為單例類別在整個應用程式運行時,只能被創造一次,而且這種創造是不是透過外部呼叫而完成,而是自身完成。所以單例類別是自己實例化自己,所以其建構子必須是私有。任何其他外部物件都不可以再次建構一個單例類別的副本。

2)因為單例類別只能夠自己實例化自己,而又要為所有外部應用提供自己的實例,所以類別內部必須有一個可供外界訪問,而又是唯一不變的訪問儲存物件點,所以要提供一個靜態變數去儲存單例類別自己實例化自己的那個實例物件。

3)因為單例類別的建構函式是私有的,所以單例類別必須提供一個外部介面供外部環境呼叫單例類,所以必須有一個靜態方法,它可以初始化單例類別或者傳回單例類別的物件的參考。

一個簡單的例子:

class DB{
   private $_link;
   //   保持单例类的静态变量
   static $_instance;
   //   私有的构造函数
   private function __construct(){
       $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__);
       if(! ($this->_link)){
          echo 'Something wrong occurs on the database connection!';  
       }
   }
   //   防止单例类被克隆
   private function __clone(){}
   //   外界访问单例类实例的接口
   public static function getInstance(){
       if(! (self::$_instance instanceof self)){
          self::$_instance = new self();
       }
       return self::$_instance;
   }
}

注意,以上定義的一個 __clone() 函數,防止單例類別物件被複製。

以下也是一個簡單的資料庫操作類別的單例,供參考:

class DB {
   /**
    * the database connection
    * @var   resource
    * @access private
    */
   private $_link;
   /**
    * the static instance of single db
    * @var   object
    * @access static
    */
   static $_instance;
   /**
    * construct the single object
    * @return null
    * @access private
    */
   private function __construct(){
       $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__);
       if(! ($this->_link)){
          echo 'Something wrong occurs on the database connection!';  
       }
   }
   /**
    * empty clone
    * @return null
    * @access private
    */
   private function __clone(){}
   /**
    * for other object to get the instance of db
    * @return self::instance
    * @access public
    */
   public static function getInstance(){
       if(! (self::$_instance instanceof self)){
          self::$_instance = new self();
       }
       return self::$_instance;
   }
   /**
    * query
    * @param  sql string
    * @param  message string
    * @return   resource
    * @access public
    */
   public function query($sql,$message){
       $result = @mysqli_query($this->$_link, $sql) or die($message . mysqli_error($this->$_link));
       return $result;
   }
   /**
    * mysqli_num_rows
    * @param  result resource
    * @return   int
    * @access public
    */
   public function num($result){
       return @mysqli_num_rows($result);
   }
   /**
    * mysqli_fetch_array
    * @param  result resource
    * @return   array
    * @access public
    */
   public function fetchArr($result){
       return @mysqli_fetch_array($result);
   }
   /**
    * mysqli_insert_id
    * @return   int
    * @access public
    */
   public function last_id(){
       return @mysqli_insert_id($this->_link);   
   }
   /**
    * close the database connection
    * @param  result resource
    * @return   null
    * @access public
    */
   public function close(){
       @mysqli_close($this->_link);
   }
   /**
    * fetch once result from the specific sql query
    * @param  sql string
    * @param  message string
    * @return   array
    * @access public
    */
   public function fetchArrOnce($sql, $message){
       $result = $this->query($sql, $message);
       $row = $this->fetchArr($result);
       return $row;
   }
   /**
    * fetch all results from the specific sql query
    * @param  sql string
    * @param  message string
    * @return   array
    * @access public
    */
   public function fetchArrMore($sql, $message){
       $result = $this->query($sql, $message);
       $moreRow = array();
       while($row = $this->fetchArr($result)){
          $moreRow[] = $row;
       }
       return $moreRow;
   }
   /**
    * fetch the number of results from the specific sql query
    * @param  sql string
    * @param  message string
    * @return   array
    * @access public
    */
   public function fetchNum($sql, $message){
       $result = $this->query($sql, $message);
       $resultNum = $this->num($result);
       return $resultNum;
   }
   /**
    * mysqli_prepare
    * @param  sql string
    * @return   stmt object
    * @access public
    */
   public function prepare($sql){
       return @mysqli_prepare($this->_link, $sql);
   }
   /**
    * mysqli_stmt_execute
    * @param  stmt object
    * @param  message string
    * @return   bool
    * @access public
    */
   public function stmt_execute($stmt, $message){
       @mysqli_stmt_execute($stmt) or die($message . mysqli_error($this->_link));
   }
}

使用:

define("__HOST__", "localhost");
define("__USER__", "root");
define("__PASSWORD__", "");
define("__DATABASE__", "eee");
$db = DB::getInstance();

以上就是本文的全部內容,希望對大家的學習有幫助。


相關推薦:

php基礎設計模式大全(註冊樹模式、工廠模式、單列模式),設計模式單列_PHP教程

PHP物件導向-單一列模式

php基礎設計模式大全(註冊樹模式、工廠模式、單列模式),設計模式單列

以上是PHP單例模式定義與使用實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn