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源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php的4种常见运行方式
Mar 20 PHP
php实现插入排序
Mar 29 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
php实现页面纯静态的实例代码
Jun 21 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
Laravel框架自定义分页样式操作示例
Jan 26 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 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
3.从实例开始
2006/10/09 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
thinkPHP框架实现生成条形码的方法示例
2018/06/06 PHP
php的扩展写法总结
2019/05/14 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
详解html-webpack-plugin用法全解
2018/01/22 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
mac系统安装Python3初体验
2018/01/02 Python
深入浅析python 中的匿名函数
2018/05/21 Python
python实现电脑自动关机
2018/06/20 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
大四本科生的自我评价
2013/12/30 职场文书
节能环保标语
2014/06/12 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
小学家长学校培训材料
2014/08/24 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
小学优秀班主任材料
2014/12/17 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server