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写的serv-u的web申请账号的程序
Oct 09 PHP
《APMServ 5.1.2》使用图解
Oct 23 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
CURL的学习和应用(附多线程实现)
Jun 03 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
php的扩展写法总结
May 14 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 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中for循环语句的几种变型
2006/11/26 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
python中的函数用法入门教程
2014/09/02 Python
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
numpy中矩阵合并的实例
2018/06/15 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
写给女生的道歉信
2014/01/08 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
协议书怎么写
2014/04/21 职场文书
最美护士演讲稿
2014/08/27 职场文书
2015年信访工作总结
2015/04/07 职场文书
2015年底工作总结范文
2015/05/15 职场文书
运动会通讯稿50字
2015/07/20 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA