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对大文件进行读取操作的实现代码
Jan 23 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
php计算函数执行时间的方法
Mar 20 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
php转换颜色为其反色的方法
Apr 27 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
PHP-FPM实现性能优化
Mar 31 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
php简单实现数组分页的方法
Apr 30 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python中xrange用法分析
2015/04/15 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
python中字符串的编码与解码详析
2020/12/03 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
学年自我鉴定范文
2013/10/01 职场文书
给孩子的新年寄语
2014/04/08 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
党员检讨书范文
2014/12/27 职场文书
企业文化学习心得体会
2016/01/21 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS