文档章节

php设计模式之单例模式

webphp
 webphp
发布于 2017/07/26 11:28
字数 525
阅读 5
收藏 0

单例模式概念

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

单例模式的特点

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

单例模式的使用原因入使用场景

我们在开发的过程中用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。下面写出的一个实例:
<?php

class Db{
	//定义一个变量,在内部实例化的时候赋于一个变量
	static private $_instance;
	//数据库连接返回资源
	static private $_connectSource;
	private $_dbConfig = array(
			'host' => '127.0.0.1',
			'user' => 'root',
			'password' => '',
			'database' => 'dataname',
	);
	
	/*私有构造方法,防止被外部实例化*/
	private function __construct(){	
	}
	/*内部私有,防止被外面克隆*/
	private function __clone(){
	
	}
	/**
	 * 静态方法,单例访问统一入口
	 */
	static public function getInstance(){
		//利用instanceof检测是否被实例
		if(!(self::$_instance instanceof self)) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}
	
	/**
	 * 创建连接数据库的方法,获取私用的连接属性
	 */
	public function connect(){
		if(!self::$_connectSource) {
			self::$_connectSource = @mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);			if(!self::$_connectSource) {
				die('mysql connect error' . mysql_error());
			}
			mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
			mysql_query("set names UTF8", self::$_connectSource);
		}
		return self::$_connectSource;
		
	}

}

$connect = Db::getInstance()->connect();
var_dump( $connect );
 
需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量) 构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

© 著作权归作者所有

共有 人打赏支持
webphp
粉丝 1
博文 92
码字总数 92338
作品 0
海淀
程序员

暂无文章

javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
0
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
0
0
学习设计模式——中介者模式

1. 认识中介者模式 1. 定义:用一个中介对象来封装一系列的对象交互行为,中介者使得各对象不需要显式的互相引用,从而使其松散耦合,独立的改变他们之间的交互。 2. 结构: Mediator:中介者...

江左煤郎
昨天
0
0
深入理解Plasma(1):Plasma 框架

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章作为开篇,主要目的是理解 Plasma 框架。 Plasma 作为以太坊的二层扩容...

HiBlock
昨天
0
0
Java 8 日期 示例

Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需...

阿刚ABC
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部