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调用数据库的存贮过程
Oct 09 PHP
第八节 访问方式 [8]
Oct 09 PHP
PHP4之真OO
Oct 09 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
PHP simplexml_load_file()函数讲解
Feb 03 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 PHP
PHP如何使用JWT做Api接口身份认证的实现
Feb 03 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
犀利的js 函数集合
2009/06/11 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
django输出html内容的实例
2018/05/27 Python
详解Python传入参数的几种方法
2019/05/16 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
python几种常用功能实现代码实例
2019/12/25 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
存储过程的优缺点是什么
2015/01/10 面试题
自我鉴定注意事项
2014/01/19 职场文书
班主任新年寄语
2014/04/04 职场文书
大型活动组织方案
2014/05/10 职场文书
应届大专生求职信
2014/06/26 职场文书
环境卫生倡议书
2014/08/29 职场文书
异地恋情人节寄语
2015/02/28 职场文书
小学语文教学随笔
2015/08/14 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python