文档章节

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
海淀
程序员
私信 提问

暂无文章

我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

问题终结者
7分钟前
0
0
Java 使用 gson 对 json 根据 key 键进行排序

引入Google的gson jar <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version>......

yh32
8分钟前
0
0
Vue.use源码解析

什么是Vue插件 关于什么是Vue插件大家可以去看官网的解释 ,总得来说就是提供一个全局注册/调用的能力。 怎么用 我们以Weex为例。 首先有一个toast.js const Toast = {}Toast.install = (Vu...

peakedness丶
15分钟前
0
0
mybatis学习(2)

http://www.mybatis.org/spring/zh/factorybean.html 参考mybatis官网 Mybatis集成Spring: 使用Spring的IOC,将sqlSession(存在事物),交给Spring管理。 1.依赖jar包 <dependency> <g......

杨健-YJ
25分钟前
2
0
ES的性能优化

我们在很多场景下会用到ES帮助我们解决搜索问题,但是很多人了解只是停留在表面,如何深入的使用ES,并做针对性的性能优化呢? 批量提交 当大量的写任务时,可以采用批量提交的方案,但是需要...

春哥大魔王的博客
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部