`
xitong
  • 浏览: 6206729 次
文章分类
社区版块
存档分类
最新评论

php设计模式——单例模式

 
阅读更多

单例模式概念

单例模式是指整个应用中类只有一个对象实例的设计模式。

单例模式的特点

  • 一个类在整个应用中只有一个实例
  • 类必须自行创建这个实例
  • 必须自行向整个系统提供这个实例

php中使用单例模式的原因

我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。
贴出我之前常用的不好的数据库连接代码,给大家一个错误示范:
<?php
class MysqlConn
{
	// MYSQL数据库连接信息
	const MYSQLHOSTNAME = "127.0.0.1";
	const MYSQLUSERNAME = "root";
	const MYSQLPASSWORD = "***";
	const MYSQLDBNAME = "test";
	const MYSQLCHARSET = "utf8";
	
	/**
 	* Description:mysql数据库连接函数
	* Return value:连接成功返回数据库连接句柄;连接失败返回错误消息
 	*/
	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单例模式的实现

<?php
class Singleton
{
	/**
	 * Description:(1)静态变量,保存全局实例,跟类绑定,跟对象无关
	 *             (2)私有属性,为了避免类外直接调用 类名::$instance,防止为空
	 */
	private static $instance;
	
	/**
	 * Description:数据库连接句柄
	 */
	private $db;
	
	/**
	 * Description:私有化构造函数,防止外界实例化对象
	 */
	private static function __construct()
	{
	}
	
	/**
	 * Description:私有化克隆函数,防止外界克隆对象
	 */
	private function __clone()
	{
	}
	
	/**
	 * Description:静态方法,单例访问统一入口
	 * @return Singleton:返回应用中的唯一对象实例
	 */
	public static function GetInstance()
	{
		if (!(self::$instance instanceof self))
		{
			self::$instance = new self();
		}
		return self::$instance;
	}
	
	/**
	 * Description:获取数据库的私有方法的连接句柄
	 */
	public function GetDbConnect()
	{
		return $this->db;
	}
}
  • 需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)
  • 构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义
  • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

分享到:
评论

相关推荐

    设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类源码

    1)程序功能:单例模式设计Memcache和Redis操作类,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/46410055。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目...

    设计模式—— 七 :单例模式

    单例模式的实现饿汉式懒汉式线程安全的懒汉式登记式单例模式的优缺点单例模式的优点单例模式的缺点 单例模式是23个模式中比较简单的模式,应用也非常广泛 什么是单例模式? 单例模式的定义: Ensure a class ...

    PHP高级程序设计-模式-框架-测试

    书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP ...

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...

    PHP高级程序设计_模式、框架与测试(简体中文高清版)

    书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP ...

    PHP高级程序设计_模式、框架与测试

    书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...

    PHP高级程序设计_模式、框架与测试 PDF及源码

    书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP ...

    中文版的PHP高级程序设计、模式、框架与测试第一部分共两部分

    书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容, 接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP ...

    php网络开发完全手册

    5.7.2 单例模式(Singleton Pattern) 81 5.7.3 工厂模式(Factory Pattern) 83 5.8 接口与抽象类 86 5.8.1 接口的定义 86 5.8.2 单一接口的实现 87 5.8.3 多重接口的实现 87 5.8.4 抽象类 88 5.9 小结 90 第6章 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例206 弹出全屏显示的网页模式对话框 261 实例207 关闭IE主窗口时不弹出询问对话框 262 实例208 弹出提示对话框并重定向网页 263 实例209 自动关闭的广告窗口 264 实例210 在弹出的对话框中选择个性头像 265 实例...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例206 弹出全屏显示的网页模式对话框 261 实例207 关闭IE主窗口时不弹出询问对话框 262 实例208 弹出提示对话框并重定向网页 263 实例209 自动关闭的广告窗口 264 实例210 在弹出的对话框中选择个性头像 265 实例...

Global site tag (gtag.js) - Google Analytics