欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP單例模式定義與使用實(shí)例詳解

 更新時(shí)間:2017年02月06日 10:29:44   作者:風(fēng)起從容  
這篇文章主要介紹了PHP單例模式定義與使用,結(jié)合具體數(shù)據(jù)庫操作類的形式較為詳細(xì)的分析了php單例模式的功能、定義、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP單例模式定義與使用。分享給大家供大家參考,具體如下:

先簡(jiǎn)單的介紹一下單例模式。單例模式就是在應(yīng)用程序中保持某一個(gè)類實(shí)例只存在一個(gè),而且不可以受外部環(huán)境的影響而生成這個(gè)類的第二個(gè)實(shí)例。它的優(yōu)點(diǎn),實(shí)際點(diǎn)見,如果在WEB開發(fā)中,保持單一個(gè)數(shù)據(jù)操作類實(shí)例的存在,可以減少不必要的多余連接數(shù)據(jù)庫資源的消耗,對(duì)于大型的軟件開發(fā)來說,可以使用單例來維持程序的狀態(tài),使不同操作實(shí)現(xiàn)同步,因?yàn)閱卫恢闭紦?jù)內(nèi)存,而從不會(huì)有副本。

而對(duì)于PHP,使用單例最常用的場(chǎng)合莫過于寫一個(gè)數(shù)據(jù)庫操作類。不過在PHP中實(shí)現(xiàn)單例,有以下規(guī)則:

1)單例類必須擁有一個(gè)現(xiàn)式聲明的構(gòu)造函數(shù),并且是私有的。

2)單例類必須有一個(gè)靜態(tài)變量來存儲(chǔ)類的實(shí)例,這樣可以保持這個(gè)單例類就只有那么一個(gè)實(shí)例。

3)單例類必須提供一個(gè)靜態(tài)方法,供其他所有的對(duì)象應(yīng)用這個(gè)單例。

為什么要滿足以上三個(gè)條件呢:

1)因?yàn)閱卫愒谡麄€(gè)應(yīng)用程序運(yùn)行時(shí),只能被創(chuàng)造一次,而且這種創(chuàng)造是不是通過外部調(diào)用而完成,而是自身完成。所以單例類是自己實(shí)例化自己,所以其構(gòu)造函數(shù)必須是私有。任何其他外部對(duì)象都不可以再次構(gòu)造一個(gè)單例類的副本。

2)因?yàn)閱卫愔荒軌蜃约簩?shí)例化自己,而又要為所有外部應(yīng)用提供自己的實(shí)例,所以類內(nèi)部必須有一個(gè)可供外界訪問,而又是唯一不變的訪問存儲(chǔ)對(duì)象點(diǎn),所以要提供一個(gè)靜態(tài)變量去存儲(chǔ)單例類自己實(shí)例化自己的那個(gè)實(shí)例對(duì)象。

3)因?yàn)閱卫惖臉?gòu)造函數(shù)是私有的,所以單例類必須提供一個(gè)外部接口供外部環(huán)境調(diào)用單例類,所以必須有一個(gè)靜態(tài)方法,它可以初始化單例類或者返回單例類的對(duì)象的引用。

一個(gè)簡(jiǎn)單的例子:

class DB{
   private $_link;
   //   保持單例類的靜態(tài)變量
   static $_instance;
   //   私有的構(gòu)造函數(shù)
   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(){}
   //   外界訪問單例類實(shí)例的接口
   public static function getInstance(){
       if(! (self::$_instance instanceof self)){
          self::$_instance = new self();
       }
       return self::$_instance;
   }
}

注意,以上定義的一個(gè) __clone() 函數(shù),防止單例類對(duì)象被克隆。

以下也是一個(gè)簡(jiǎn)單的數(shù)據(jù)庫操作類的單例,供參考:

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • php自定義函數(shù)實(shí)現(xiàn)JS的escape的方法示例

    php自定義函數(shù)實(shí)現(xiàn)JS的escape的方法示例

    這篇文章主要介紹了php自定義函數(shù)實(shí)現(xiàn)JS的escape的方法,結(jié)合完整實(shí)例形式分析了php實(shí)現(xiàn)JS的escape功能函數(shù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • PHP獲取數(shù)組中重復(fù)最多的元素的實(shí)現(xiàn)方法

    PHP獲取數(shù)組中重復(fù)最多的元素的實(shí)現(xiàn)方法

    這篇文章主要介紹了PHP獲取數(shù)組中重復(fù)最多的元素的實(shí)現(xiàn)方法,通過一個(gè)自定義函數(shù)遍歷數(shù)組實(shí)現(xiàn)這一功能,是非常使用的技巧,需要的朋友可以參考下
    2014-11-11
  • 最新評(píng)論