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 auth_http类库进行身份效验
Mar 19 PHP
一个比较简单的PHP 分页分组类
Dec 10 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
CodeIgniter连贯操作的底层原理分析
May 17 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 ios推送(代码)
2013/07/01 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
python Django模板的使用方法
2016/01/14 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python实现决策树分类
2018/08/30 Python
Python 变量类型详解
2018/10/10 Python
使用Python进行目录的对比方法
2018/11/01 Python
python 自动重连wifi windows的方法
2018/12/18 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
建议书怎么写
2014/03/12 职场文书
病媒生物防治方案
2014/05/13 职场文书
生活部的活动方案
2014/08/19 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
Python可视化学习之seaborn调色盘
2022/02/24 Python