文档章节

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
码字总数 92070
作品 0
海淀
程序员

暂无文章

Memcached启动参数详解

memcached -d -m 1024 -l 192.168.100.101 -p 11211 -P /tmp/memcached.pid -c 1024 -f 1.25 -n 80 -t 16 运行参数描述 -d:以守护(daemon)进程方式启动; -u:是运行Memcache的用户,例如 ......

月下狼
30分钟前
0
0
xgboost-kaggle

https://www.kaggle.com/dansbecker/xgboost This tutorial is part of the Learn Machine Learning series. In this step, you will learn how to build and optimize models with the powe......

tantexian
31分钟前
0
0
nginx学习八 代理服务

最常用的语法 proxy_pass Syntax: proxy_pass URL;Default: --Context:location.if in location,limit_exception 反向代理 例:/etc/nginx/conf.d/default.conf 反向代理(代理服务端)......

Romanceling
38分钟前
0
0
npm ERR! Unexpected end of JSON ...

npm install 报错: npm ERR! Unexpected end of JSON input while parsing near '..."^2.8.14"},"_hasShrin' npm ERR! A complete log of this run can be found in: ... 打开终端 命令: 第......

大_侠
42分钟前
0
0
Android中的设计模式之责任链模式

参考 《设计模式:可复用面向对象软件的基础 》5.1 Chain of responsibility 职责链 对象行为型模式 《Android源码设计模式解析与实战》第9章 使编程更有灵活性--责任链模式 意图 使多个对象...

newtrek
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部