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安装swoole扩展的方法
Mar 19 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
Linux安装配置php环境的方法
Jan 14 PHP
php+html5实现无刷新图片上传教程
Jan 22 PHP
简单谈谈php浮点数精确运算
Mar 10 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
PHP数据库操作四:mongodb用法分析
Aug 16 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 PHP
php json转换相关知识(小结)
Dec 21 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
laravel 模型查询按照whereIn排序的示例
Oct 16 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
PHP内核探索之变量
2015/12/22 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Python递归函数定义与用法示例
2017/06/02 Python
python实现简单日期工具类
2019/04/24 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
python切割图片的示例
2020/11/12 Python
英国袜子店:Sock Shop
2017/01/11 全球购物
XML文档面试题
2015/08/05 面试题
节水标语大全
2014/06/11 职场文书
超市周年庆活动方案
2014/08/16 职场文书
助学贷款贫困证明
2014/09/23 职场文书
个人委托书如何写
2014/09/25 职场文书
二胎满月酒致辞
2015/07/29 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
用python开发一款操作MySQL的小工具
2021/05/12 Python
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers