单例模式三大原则
构造函数需要标记为非public(防止外部使用new来操作符常见对象)。单例类不能在其他类中实例化,只能被其自身实例化。
拥有一个保存类的实例的静态成员变量$_instance(这个变量是一个约定俗成的规范,大家一看就知道是单例模式)。
拥有一个访问这个实例的公共的静态方法。
单例模式举例:
<?php
/********************************
*
* 单例模式举例说明
* 学php的小蚂蚁
* 原创博客 http://my.oschina.net/woshixiaomayi/blog
*
***************************/
class Db{
//保存实例化的对象
private static $_instance;
//将构造成员设置为私有,禁止外部实例化
private function __construct(){
}
//实例化入口
public static function getInstance(){
/*
查看是否已经实例化了,如果已经实例化了就直接返回,
没有实例化则实例化。保证只能实例化1次
*/
if(!(self::$_instance instanceof self)){
//没有实例化,这进行实例化
self::$_instance = new Db();
}
//将实例化的对象返回
return self::$_instance;
}
}
?>
那么单例模式有什么优点,我们为什么要使用单例模式呢?
php的应用主要在于数据库的应用,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量的new操作,节约资源。
如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。
在一次页面请求中,便于进行调试,因为所有的代码(例如数据库db操作类)都集中于一个类中,我们可以在类中设置钩子,输出日志,从而避免了到处var_dump(),echo ()等等。
接下来用单例模式来丰满这个db类:
<?php
/********************************
*
* 单例模式开发db库
* 学php的小蚂蚁
* 原创博客 http://my.oschina.net/woshixiaomayi/blog
*
***************************/
class Db{
//保存实例化的对象
private static $_instance;
//保存数据库连接资源
private static $_connectSourse;
//数据库配置属性
private $dbConfig = array(
'host' => '127.0.0.1', // 主机ip
'name' => 'root', // 用户名
'password' => '123456', // 密码
'database' => 'biicai' // 操作的数据库
);
//将构造成员设置为私有,禁止外部实例化
private function __construct(){
}
//实例化入口
public static function getInstance(){
/*
查看是否已经实例化了,如果已经实例化了就直接返回,
没有实例化则实例化。保证只能实例化1次
*/
if(!(self::$_instance instanceof self)){
//没有实例化,这进行实例化
self::$_instance = new Db();
}
//将实例化的对象返回
return self::$_instance;
}
//连接数据库
public function connect(){
//判断是否已经连接数据库,保证只连接一次
if(!self::$_connectSourse){
//获取连接数据库的资源
self::$_connectSourse = mysql_connect($this->dbConfig['host'],$this->dbConfig['name'],$this->dbConfig['password']);
//如果没有连接上数据库,需要抛出一个异常
if(!self::$_connectSourse){
throw new Exception('mysql connect error'.mysql_error);
}
//设置要操作的数据库
mysql_select_db($this->dbConfig['database'],self::$_connectSourse);
//设置数据库的字符集
mysql_query('set names UTF8',self::$_connectSourse);
}
//将数据库连接资源返回
return self::$_connectSourse;
}
}
//得到连接数据库的资源
$connect=Db::getInstance()->connect();
//var_dump($connect); resource(2) of type (mysql link)
//编写sql语句
$sql='select user_name from ecm_member limit 5';
//执行sql语句,得到一个结果集
$result = mysql_query($sql,$connect);
//var_dump($result); resource(3) of type (mysql result)
$arr=array();
while($row=mysql_fetch_assoc($result)){
$arr[]=$row;
}
echo '<pre>';
print_r($arr);
?>