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

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

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

2、私有克隆类的函数

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

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

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

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

具体代码如下:

<?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['id'].",".$row['username'].",".$row['password']."<br/>";
} ?>
这样保证了class db所对应的实例$dbconnector有且只有一个,再有一句:

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

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

版权声明:本文为博主原创文章,未经博主允许,欢迎随意转载,标好作者+原文地址就可以了!感谢欣赏!觉得好请回个贴! https://blog.csdn.net/yongh701/article/details/49182891

最新文章

  1. C++整数转字符串的一种方法
  2. 关闭form上chrome的autofill
  3. 《InsideUE4》-9-GamePlay架构(八)Player
  4. 闪电动画模拟(Dielectric Breakdown Model)附源码
  5. Android与Swift iOS开发:语言与框架对比
  6. Hibernate的初步
  7. testng.xml创建及解析
  8. cookie操作大全
  9. HDOJ(HDU) 1718 Rank(水题、、、)
  10. JavaFX2: 鼠标拖动选择和Ctrl+Shift连续区间选择的ListView
  11. BlackBerry Phonegap项目的搭建
  12. nginx集群tomcat
  13. [转]php中 curl模拟post发送json并接收json
  14. 关于Mac或Linux下GO的Permission denied提示错误
  15. Python 简单入门指北(一)
  16. 1131 Subway Map DFS解法 BFS回溯!
  17. IDEA激活
  18. stm32定时器PWM模式和输出比较模式
  19. 使用flow捕获js错误提高代码质量
  20. 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)

热门文章

  1. Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
  2. form表单提交注意事项
  3. Javascript 随机数函数 学习之二:产生服从正态分布随机数
  4. Vue.js之生命周期
  5. 【代码笔记】iOS-NSTimer
  6. Tronado自定义Session
  7. eclipse安装可视化swing插件
  8. js的style.display小问题
  9. Tracing 在PeopleSoft 程序中怎么开启
  10. Available to Promise (ATP) in SAP-SD