单例模式概念
单例模式是指整个应用中类只有一个对象实例的设计模式。
单例模式的特点
-
一个类在整个应用中只有一个实例
-
类必须自行创建这个实例
-
必须自行向整个系统提供这个实例
php中使用单例模式的原因
我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会
存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都
是对数据库的一种极大考验和浪费。
贴出我之前常用的不好的数据库连接代码,给大家一个错误示范:
-
-
class MysqlConn
-
{
-
-
const MYSQLHOSTNAME = "127.0.0.1";
-
const MYSQLUSERNAME = "root";
-
const MYSQLPASSWORD = "***";
-
const MYSQLDBNAME = "test";
-
const MYSQLCHARSET = "utf8";
-
-
-
-
-
-
public function MysqlConnect()
-
{
-
$db = new mysqli(self::MYSQLHOSTNAME, self::MYSQLUSERNAEM, self::MYSQLPASSWORD, self::MYSQLDBNAME);
-
$db->set_charset(self::MYSQLCHARSET);
-
if (mysqli_connect_errno())
-
{
-
throw new CircleMysqlException("服务器系统故障", 1001);
-
}
-
else
-
{
-
return $db;
-
}
-
}
-
}
缺陷:
每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回close掉,频繁的new和数据库连接关闭操作是非常消耗资源的
改进:
每次应该直接返回当前应用中已经打开的数据库连接句柄
-
-
$db = MysqlConn::SingleMysqlConnect();
php单例模式的实现
-
-
class Singleton
-
{
-
-
-
-
-
private static $instance;
-
-
-
-
-
private $db;
-
-
-
-
-
private static function __construct()
-
{
-
}
-
-
-
-
-
private function __clone()
-
{
-
}
-
-
-
-
-
-
public static function GetInstance()
-
{
-
if (!(self::$instance instanceof self))
-
{
-
self::$instance = new self();
-
}
-
return self::$instance;
-
}
-
-
-
-
-
public function GetDbConnect()
-
{
-
return $this->db;
-
}
-
}
-
需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)
-
构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义
-
必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用
阅读(1004) | 评论(0) | 转发(0) |