PHP单例模式定义与使用实例详解
发布:smiling 来源: PHP粉丝网 添加日期:2018-07-31 11:01:22 浏览: 评论:0
先简单的介绍一下单例模式。单例模式就是在应用程序中保持某一个类实例只存在一个,而且不可以受外部环境的影响而生成这个类的第二个实例。它的优点,实际点见,如果在WEB开发中,保持单一个数据操作类实例的存在,可以减少不必要的多余连接数据库资源的消耗,对于大型的软件开发来说,可以使用单例来维持程序的状态,使不同操作实现同步,因为单例一直占据内存,而从不会有副本。
而对于PHP,使用单例最常用的场合莫过于写一个数据库操作类。不过在PHP中实现单例,有以下规则:
1)单例类必须拥有一个现式声明的构造函数,并且是私有的。
2)单例类必须有一个静态变量来存储类的实例,这样可以保持这个单例类就只有那么一个实例。
3)单例类必须提供一个静态方法,供其他所有的对象应用这个单例。
为什么要满足以上三个条件呢:
1)因为单例类在整个应用程序运行时,只能被创造一次,而且这种创造是不是通过外部调用而完成,而是自身完成。所以单例类是自己实例化自己,所以其构造函数必须是私有。任何其他外部对象都不可以再次构造一个单例类的副本。
2)因为单例类只能够自己实例化自己,而又要为所有外部应用提供自己的实例,所以类内部必须有一个可供外界访问,而又是唯一不变的访问存储对象点,所以要提供一个静态变量去存储单例类自己实例化自己的那个实例对象。
3)因为单例类的构造函数是私有的,所以单例类必须提供一个外部接口供外部环境调用单例类,所以必须有一个静态方法,它可以初始化单例类或者返回单例类的对象的引用。
一个简单的例子:
- classDB{
- private$_link;
- // 保持单例类的静态变量
- static$_instance;
- // 私有的构造函数
- privatefunction__construct(){
- $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__);
- if(! ($this->_link)){
- echo'Something wrong occurs on the database connection!'
- }
- }
- // 防止单例类被克隆
- privatefunction__clone(){}
- // 外界访问单例类实例的接口
- publicstaticfunctiongetInstance(){
- if(! (self::$_instanceinstanceofself)){
- self::$_instance=newself();
- }
- returnself::$_instance;
- }
- }
注意,以上定义的一个 __clone() 函数,防止单例类对象被克隆。
以下也是一个简单的数据库操作类的单例,供参考:
- classDB {
- /**
- * 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
- */
- privatefunction__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
- */
- privatefunction__clone(){}
- /**
- * for other object to get the instance of db
- * @return self::instance
- * @access public
- */
- publicstaticfunctiongetInstance(){
- if(! (self::$_instanceinstanceofself)){
- self::$_instance=newself();
- }
- returnself::$_instance;
- }
- /**
- * query
- * @param sql string
- * @param message string
- * @return resource
- * @access public
- */
- publicfunctionquery($sql,$message){
- $result= @mysqli_query($this->$_link,$sql)ordie($message. mysqli_error($this->$_link));
- return$result;
- }
- /**
- * mysqli_num_rows
- * @param result resource
- * @return int
- * @access public
- */
- publicfunctionnum($result){
- return@mysqli_num_rows($result);
- }
- /**
- * mysqli_fetch_array
- * @param result resource
- * @return array
- * @access public
- */
- publicfunctionfetchArr($result){
- return@mysqli_fetch_array($result);
- }
- /**
- * mysqli_insert_id
- * @return int
- * @access public
- */
- publicfunctionlast_id(){
- return@mysqli_insert_id($this->_link);
- }
- /**
- * close the database connection
- * @param result resource
- * @return null
- * @access public
- */
- publicfunctionclose(){
- @mysqli_close($this->_link);
- }
- /**
- * fetch once result from the specific sql query
- * @param sql string
- * @param message string
- * @return array
- * @access public
- */
- publicfunctionfetchArrOnce($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
- */
- publicfunctionfetchArrMore($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
- */
- publicfunctionfetchNum($sql,$message){
- $result=$this->query($sql,$message);
- $resultNum=$this->num($result);
- return$resultNum;
- }
- /**
- * mysqli_prepare
- * @param sql string
- * @return stmt object
- * @access public
- */
- publicfunctionprepare($sql){
- return@mysqli_prepare($this->_link,$sql);
- }
- /**
- * mysqli_stmt_execute
- * @param stmt object
- * @param message string
- * @return bool
- * @access public
- */
- publicfunctionstmt_execute($stmt,$message){
- @mysqli_stmt_execute($stmt)ordie($message. mysqli_error($this->_link));
- }
- }
使用:
- define("__HOST__","localhost");
- define("__USER__","root");
- define("__PASSWORD__","");
- define("__DATABASE__","eee");
- $db= DB::getInstance();
Tags: 实例 模式 单例PHP
相关文章
- ·php 用户注册实例代码,适合初学者(2013-12-11)
- ·php 缓冲技术中常用几个实例(2013-12-23)
- ·ajax php用户无刷新登录实例(2013-12-23)
- ·php中登录后跳转回原来要访问的页面实例(2014-01-06)
- ·php生成多个不重复的随机数实例程序(2014-01-08)
- ·php获取复选框checkbox值内容实例(2014-01-10)
- ·PHP多进程简单实例程序(2014-01-10)
- ·PHP代码实现301跳转页面实例(2014-01-11)
- ·PHPMailer 发送邮件实例程序(2014-01-25)
- ·使用PHPMailer发送邮件实例代码总结(2014-01-25)
- ·PHP类中的静态方法使用实例(2014-02-18)
- ·php 浮点数精度值实例程序详解(2014-02-21)
- ·PHP1到100求和各种实例程序(2014-02-22)
- ·php工厂模式简单使用说明(2014-02-25)
- ·php mvc中controller类实例教程(2014-03-30)
- ·php trim() 表单验证不为空实例(2014-05-23)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)