面向对象编程_数据库操作类

目录

1、mysqldb_class.php

2、单例模式

3、对象的克隆


1、mysqldb_class.php

<?php
class MySQLDB
{
    //数据库连接信息
    private $dbConfig=array(
        'host'=>'localhost',
        'port'=>'3306',
        'user'=>'',
        'pwd'=>'',
        'charset'=>'utf8',
        'dbname'=>''
    );
    private $link;

    /**
     * 初始化属性
     * @param array $params 数据库连接信息
     */
    private function initAttr($params)
    {   //初始化属性,使用array_marge()函数合并两个数组
        $this->dbConfig=array_merge($this->dbConfig,$params);
    }
    /**
     * 连接数据库
     */
    private function connectServer()
    {
        $host=$this->dbConfig['host'];
        $port=$this->dbConfig['port'];
        $user=$this->dbConfig['user'];
        $pwd=$this->dbConfig['pwd'];
        //连接数据库服务器
        if($link=mysql_connect("$host;$port",$user,$pwd)){
            $this->link=$link;
        }else{
            die('数据库连接失败。'.mysql_error());
        }
    }
    /**
     * 设定字符集
     */
    private function setCharset()
    {
        $sql=" set names {$this->dbConfig['charset']}";
        $this->query($sql);
    }
    /**
     * 选择默认数据库
     */
    private function selectDefaultDb()
    {
        //判断$this->dbConfig['dbname']是否为空。为空表示不需要选择数据库。
        if($this->dbConfig['dbname']==''){
            return;
        }
        $sql="use `{$this->dbConfig['dbname']}`";
        $this->query($sql);
    }
    /**
     * 构造方法
     * @param array $params 数据库连接信息
     */
    public function __construct($params=array())
    {
        //初始化属性
        $this->initAttr($params);
        //连接数据库
        $this->connectServer();
        //设定字符集
        $this->setCharset();
        //选择默认数据库
        $this->selectDefaultDb();
    }

    /**
     * 执行SQL语句,获取结果集
     * @param string $sql 待执行的SQL
     * @return resource
     */
    public function query($sql)
    {
        if($result=mysql_query($sql,$this->link)){
            //执行成功
            return $result;
        }else{
            //执行失败
            echo 'SQL执行失败:<br>';
            echo '错误的SQL为:'.$sql.'<br>';
            echo '错误的代码为:'.mysql_errno($this->link).'<br>';
            echo '错误的信息为:'.mysql_error($this->link).'<br>';
            die;
        }
    }

    /**
     * 查询单条记录
     * @param string $sql
     * @return array 一维数组
     */
    public function fetchRow($sql){
        if($result=$this->query($sql)){
            $row=mysql_fetch_array($result,MYSQL_ASSOC);
            return $row;
        }else{
            return false;
        }
    }

    /**
     * 处理多条数据
     * @param string $sql
     * @return array 二维数组
     */
    public function fetchAll($sql){
        if($result=$this->query($sql)){
            $rows=array();
            while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
                $rows[]=$row;
            }
            mysql_free_result($result);
            return $rows;
        }else{
            return false;
        }
    }
    /**
     * mysql转义字符串
     * @param $data 待转义的字符串
     * @return string
     */
    public function escapeString($data){
        return mysql_real_escape_string($data,$this->link);
    }

}

2、单例模式

通过单例模式。可以做到一个类只能被实例化一次。

(1)在定义数据库操作类的成员属性的时候,添加一个私有静态成员。

//单例对象引用
private static $instance;

(2)私有化构造方法。防止类在外部被实例化,但可以在类内实例化

//私有化构造方法。防止类在外部被实例化,但可以在类内实例化
private function __construct($params=array())
{ 
    ...... 
}

(3)添加一个静态成员方法,作为获取单例对象的公共接口,通过类访问这个静态方法来实例化对象。

/*
 * 获得单例对象的公共接口方法
 * @param array $params 数据库连接信息
 * @return object 单例的对象
 */
public static function getInstance($params=array())
{
    //判断是否没有实例化过
    if(!self::$instance instanceof self){
        //实例化并保存
        self::$instance=new self($params);
    }
    //返回对象
    return self::$instance;
}

(4)把克隆方法声明为私有的

/**
 * 私有克隆
 */
private function __clone(){

}

当在类的外部执行“clone$对象名”时,会自动调用该对象的__clone()方法,复制这个对象。因此我们需要把__clone()方法私有化,这样在外部就无法调用该方法。

注意:__clone()、__construct()、__destruct()方法都是类中默认存在的方法,即使在类文件中不进行声明,这些方法依然存在,只不过是空方法。

3、对象的克隆

对象复制可以通过clone关键字来完成,示例代码:$copy_of_object=clone $object;

当对象被复制后,PHP会对对象的所有属性执行复制操作。当复制完成时,如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用,可用于修改属性的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值