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+javascript实现二级级联菜单的制作
May 06 PHP
php数组对百万数据进行排除重复数据的实现代码
Jun 08 PHP
PHP中输出转义JavaScript代码的实现代码
Apr 22 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
php定时执行任务设置详解
Feb 06 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
PHP写的简单数字验证码实例
May 23 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
php png失真的原因及解决办法
Nov 17 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中删除变量时unset()和null的区别分析
2011/01/27 PHP
php curl模拟post请求小实例
2013/11/13 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
php自动载入类用法实例分析
2016/06/24 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
Python守护进程和脚本单例运行详解
2017/01/06 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
python实现SOM算法
2018/02/23 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
python实现图片识别汽车功能
2018/11/30 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Python 处理文件的几种方式
2019/08/23 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
党员服务承诺书
2014/05/28 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
python字典进行运算原理及实例分享
2021/08/02 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android