• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP单例模式定义与使用实例详解

php 搞代码 3年前 (2022-01-22) 31次浏览 已收录 0个评论

这篇文章主要介绍了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, $mess<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码)网8</i><strong>搞代gaodaima码</strong>age){       $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));   }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP单例模式定义与使用实例详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址