PHP单例模式详细介绍


Posted in PHP onJuly 01, 2015

单例模式的概念

单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

单例模式的特点

单例模式的主要特点是“三私一公”:
需要一个保存类的唯一实例的私有静态成员变量
构造函数
必须声明为私有的,防止外部程序new一个对象从而失去单例的意义
克隆函数必须声明为私有的,防止对象被克隆
必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。

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

在PHP的大多数应用中都会存在大量的数据库操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的系统资源和内存资源,而且每次打开和关闭数据库都是对数据库的一种极大考验和浪费。所以单例模式经常用在数据库操作类中。
同样,如果系统中需要有一个类来全局控制某些配置信息,那使用单例模式可以很方便的实现。

PHP单例模式实现

下面是一个PHP单例模式实现数据库操作类的框架

<?php
 class Db{
 const DB_HOST='localhost';
 const DB_NAME='';
 const DB_USER='';
 const DB_PWD='';
 private $_db;
 //保存实例的私有静态变量
 private static $_instance;
 //构造函数和克隆函数都声明为私有的
 private function __construct(){
  //$this->_db=mysql_connect();
 }
 private function __clone(){
  //实现
 }
 //访问实例的公共静态方法
 public static function getInstance(){
  if(!(self::$_instance instanceof self)){
  self::$_instance=new self();
  }
  //或者
  if(self::$_instance===null){
  self::$_instance=new Db();
  }
  return self::$_instance;
 }
 public function fetchAll(){
  //实现
 }
 public function fetchRow(){
  //实现
 }
 }
 //类外部获取实例的引用
 $db=Db::getInstance();
?>
PHP 相关文章推荐
PHP的中问验证码
Nov 25 PHP
理解php Hash函数,增强密码安全
Feb 25 PHP
ajax取消挂起请求的处理方法
Mar 18 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
thinkphp自带验证码全面解析
Sep 18 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 PHP
详解PHP队列的实现
Mar 14 PHP
curl和libcurl的区别简介
Jul 01 #PHP
PHP+Ajax实时自动检测是否联网的方法
Jul 01 #PHP
PHP超全局数组(Superglobals)介绍
Jul 01 #PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 #PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 #PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 #PHP
php实现的网络相册图片防盗链完美破解方法
Jul 01 #PHP
You might like
利用php获取服务器时间的实现代码
2013/06/07 PHP
PHP可变函数的使用详解
2013/06/14 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
2013年军训通讯稿
2014/02/05 职场文书
《白鹅》教学反思
2014/04/13 职场文书
2014年党支部承诺书
2014/05/30 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
小学新教师个人总结
2015/02/05 职场文书
企业培训简报范文
2015/07/20 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
关于使用Redisson订阅数问题
2022/01/18 Redis