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语法(4)
Oct 09 PHP
如何利用php+mysql保存和输出文件
Oct 09 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
PHP输出XML到页面的3种方法详解
Jun 06 PHP
php获取文件内容最后一行示例
Jan 09 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
Thinkphp+smarty+uploadify实现无刷新上传
Jul 30 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
php 静态属性和静态方法区别详解
Apr 09 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
yii2.0框架场景的简单使用示例
Jan 25 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 日期时间函数的高级应用技巧
2009/10/10 PHP
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
python实现从ftp服务器下载文件的方法
2015/04/30 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
千元咖啡店的创业计划书范文
2013/12/29 职场文书
水果超市创业计划书
2014/01/27 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
优秀党支部申报材料
2014/12/24 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python