首页  >  文章  >  后端开发  >  php单例模式设计数据库并连接Model类

php单例模式设计数据库并连接Model类

小云云
小云云原创
2018-03-29 10:53:041637浏览

利用《【Java】单例模式》(点击打开链接)介绍的思想可以将这个数据库链接类搞成单例,不会因为多个用户访问网站就创建一个数据库查询实例,拖慢整个网站的速度,让网站的数据库压力比较大,造成网站的速度下降得很厉害。

单例实现最关键的,还是那3点:

1、私有构造函数,这里无须像Java那样私有无参数的构造函数,php不允许有多个构造函数——即使这些构造函数参数不同也不可以。

2、私有克隆类的函数

3、暴露一个公有的“创造实例函数”供调用,这个“创造实例函数”判断如果已存在相应实例,返回此实例,没有才创建。

这样保证此数据库连接类有且只有一个。

直接用一个例子说明,数据库test中有表user


先利用利用单例模式设计数据库连接Model类,将这张表的内容查询到网页上:


  1. <?php  
    class db{  
        private $link;  
        //db类单例开始  
        //保存类实例的私有静态成员变量  
        private static $_instance;  
        //定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化  
        private function __construct($host,$username,$password,$database){  
            $this->link=mysql_connect($host,$username,$password);  
            if(!$this->link){  
                die("连接失败!");  
            }  
            mysql_query("set names utf8;");  
            mysql_select_db($database);  
        }  
        //定义私有的__clone()方法,确保单例类不能被复制或克隆  
        private function __clone(){}  
        public static function getInstance($host, $username, $password,$database) {  
            //检测类是否被实例化  
            if(!(self::$_instance instanceof self)){  
                self::$_instance=new db($host,$username,$password,$database);  
            }  
            return self::$_instance;  
        }  
        //执行SQL语句  
        public function query($query){  
            return mysql_query($query, $this->link);  
        }  
        //关闭数据库连接  
        public function close(){  
            return mysql_close($this->link);  
        }  
    }  
    //调用单例类测试部分  
    header("Content-type: text/html; charset=utf-8"); //设置网页编码  
    $dbconnector=db::getInstance("localhost","root","root","test");//创建数据库连接类  
    $result=$dbconnector->query("select * from user");//查询数据库  
    for($i=0;$row=mysql_fetch_array($result);$i++){//打印查询结果  
        echo $row[&#39;id&#39;].",".$row[&#39;username&#39;].",".$row[&#39;password&#39;]."<br/>";  
    }    
    ?>


这样保证了class db所对应的实例$dbconnector有且只有一个,再有一句:

  1. $dbconnector1
    =db::getInstance(
    "localhost"
    ,
    "root"
    ,
    "root"
    ,
    "test"
    );
    //创建数据库连接类


还是会返回原来的已经创建实例$dbconnector,更应该说操作$dbconnector与$dbconnector1是同样的效果,它们就是同一个东西,不会在服务器的内存上多开辟资源来存放$dbconnector与$dbconnector1,因为db被单例了,从而达到减少数据库压力的目的。

相关推荐:

设计数据库之经验谈_PHP教程

以上是php单例模式设计数据库并连接Model类的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn