目录
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()方法会被调用,可用于修改属性的值。