PHP-单例模式-数据库类

时间:2021-10-29 10:03:42

程序猿想找对象怎么办?很简单,new一个对象就好了,想要多少要多少,但是反复的实例化类,真的好吗?你说呢

以下是对设计模式单例模式的理解,和一个简单数据库操作类的体现。

首先我们需要来了解一下,单例模式的概念形式。

单例模式(Singleton Pattern 单件模式或单元素模式)
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。

单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。

单例模式有以下3个特点:

1.只能有一个实例。

2.必须自行创建这个实例。

3.必须给其他对象提供这一实例。

单例模式在一些特定的情况下可以节省资源的消耗,例如同一页面对数据库的多次操作,不需要去new多次从而节省了资源。 
单例模式的关键在于PHP中的“instanceof”,它用来检测一个变量是否是某个类的一个实例。
同时,为了防止用户去new实例,需要将“__construct”函数权限设置为private。
为了防止用户进行clone,也要重写“__clone”方法

通常来说数据库的实例,就是单例模式的典型体现,因为数据库Mysql的操作很多,我们不可能每次都去new一个类,减少它的实例化。

当然也有一定的缺点,但是其他的设计模式可以包容解决
缺点:

  1. 难于调试

  2. 隐藏的依赖关系

  3. 无法用错误类型的数据覆写一个单例

以下是代码部分 db.class.php>>

<?php
/**
* 单例模式的数据库链接
*/

class Db{

private static $instance; //用静态成员来保存
private $dbConfig = array( //数据库配置信息
'host'=>'localhost',
'username'=>'root',
'password'=>'',
'database'=>'db_info');
protected static $dbConnect; //数据库连接返回的资源
//私有构造函数,防止被实例
private function __construct(){
}
//重写clone,防止被克隆
public function __clone(){
}

/**
* 通过类的自身来实例化
*/

public static function getInstance(){
if(!(self::$instance instanceof self)){ //检测一把对象是否是该类实例化的
self::$instance = new self();
}
return self::$instance;
}
/**
* 连接数据库
*/


public function connect(){
self::$dbConnect = mysql_connect(
$this->dbConfig['host'], $this->dbConfig['username'], $this->dbConfig['password']) or die('连接数据库服务器失败!');
mysql_select_db($this->dbConfig['database']);
mysql_query('set names utf8');
}
/**
* 操作数据库
* @param [string] $sql 数据库语句
* @return [bool or resource] 返回布尔或者资源
*/

public function query($sql){
if(!empty($sql)){
$query = mysql_query($sql);
if($query){
return $query;
}else{
return false;
}
}
else{
return false;
}
}

/**
* 提取字符集,传入数据库的资源集
* @param [type] $resData [description]
* @return [type] [description]
*/

public function fetchAll($resData){
if(is_resource($resData)){
$arrcon = array();
while($arr = mysql_fetch_assoc($resData)){
$arrcon[] = $arr;
}
unset($resData);
return $arrcon;
}else{
return false;
}
}

/**
* 关闭资源集
*/

private function __destruct(){
if(strtolower(get_resource_type(self::$dbConnect))=='mysql link'){
mysql_close(self::$dbConnect);
}
}

}