PHP-单例模式-数据库类

程序猿想找对象怎么办?很简单,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);
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值