数据库单件模式
数据库单件模式单例模式:通俗点讲,就是某个类只产生一个实例,无论你在哪个地方用,他们都是一个东西,不熟悉oop的可以联想成指针[虽然不太确切]。
一、基本上是这样的
为了节省数据库连接资源,我们经常在数据库连接类中使用这个模式。基本代码如下:<?php
class db
{
private static $instance=false;
public static function instance($host,$name,$pass,$dbname)
{
if(self::$instance===false)
{
self::$instance=new db(......);
}
return self::$instance;
}
private function __construct()
{
/*这个函数必须是私有的,它保证了只能通过单例生成器来获得实例*/
}
public function __clone()
{
/*什么也不做*/
}
}
?>复制代码
好了现在我们无论在哪个文件里使用
$db=db::instance(......);
的时候都会使用一个统一的数据库连接,而不会重新打开一个新连接了,这样有利用节省资源
二、对不起,有时候我们是好几台服务器
这个时候你只需要修改一下instance函数就行了, private static $instance=array();
public static function instance($host,$name,$pass,$dbname)
{
$hash=$host.$name.$pass.$dbname;
if(!isset(self::$instance[$hash]) || self::instance[$hash]===false )
{
self::$instance[$hash]=new db(......);
}
return self::$instance;
}复制代码
大体的意思就是上面这样的了,不过最好想一下不要参数的传递方式,实际应用中最好用数组来统一管理这些数据,每次传四个变量太痛苦了。
三、小气鬼的设置
我在我程序里这么用的,这台电脑上没有代码,就不上代码了,就是对这个实例我先pre_connect赋上数据库联接信息,当我query的时候我才去真正连接[如果没连接的话,这里包括设置编码,选择数据库等初始化操作]
这样我们在程序入口定义好信息,在第一次真正操作连接数据库前能让数据库休息着
最后,单例模式在序列化和反序列化的时候会出现一些问题,大家可以去看laruence大牛的两篇文章
Serialize/Unserialize破坏单例
http://www.laruence.com/2011/03/18/1909.html
可序列化单例模式的遗留问题答案
http://www.laruence.com/2011/03/18/1916.html
页:
[1]