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

28 篇文章 1 订阅

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

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

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

2、私有克隆类的函数

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

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

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


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


具体代码如下:

[php]  view plain  copy
  1. <?php  
  2. class db{  
  3.     private $link;  
  4.     //db类单例开始  
  5.     //保存类实例的私有静态成员变量  
  6.     private static $_instance;  
  7.     //定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化  
  8.     private function __construct($host,$username,$password,$database){  
  9.         $this->link=mysql_connect($host,$username,$password);  
  10.         if(!$this->link){  
  11.             die("连接失败!");  
  12.         }  
  13.         mysql_query("set names utf8;");  
  14.         mysql_select_db($database);  
  15.     }  
  16.     //定义私有的__clone()方法,确保单例类不能被复制或克隆  
  17.     private function __clone(){}  
  18.     public static function getInstance($host$username$password,$database) {  
  19.         //检测类是否被实例化  
  20.         if(!(self::$_instance instanceof self)){  
  21.             self::$_instance=new db($host,$username,$password,$database);  
  22.         }  
  23.         return self::$_instance;  
  24.     }  
  25.     //执行SQL语句  
  26.     public function query($query){  
  27.         return mysql_query($query$this->link);  
  28.     }  
  29.     //关闭数据库连接  
  30.     public function close(){  
  31.         return mysql_close($this->link);  
  32.     }  
  33. }  
  34. //调用单例类测试部分  
  35. header("Content-type: text/html; charset=utf-8"); //设置网页编码  
  36. $dbconnector=db::getInstance("localhost","root","root","test");//创建数据库连接类  
  37. $result=$dbconnector->query("select * from user");//查询数据库  
  38. for($i=0;$row=mysql_fetch_array($result);$i++){//打印查询结果  
  39.     echo $row['id'].",".$row['username'].",".$row['password']."<br/>";  
  40. }    
  41. ?>  

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

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

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

原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值