PHP單例模式定義與使用執行個體詳解

來源:互聯網
上載者:User
這篇文章主要介紹了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();

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.