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文件的实现方法
Mar 19 PHP
PHP面向对象概念
Nov 06 PHP
基于php权限分配的实现代码
Apr 28 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
Linux系统下php获得系统分区信息的方法
Mar 30 PHP
php生成rss类用法实例
Apr 14 PHP
php中session定期自动清理的方法
Nov 12 PHP
PHP的PDO操作简单示例
Mar 30 PHP
Yii2如何批量添加数据
May 17 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
Apr 08 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 PHP
PHP基于mcript扩展实现对称加密功能示例
Feb 21 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 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php文件下载处理方法分析
2015/04/22 PHP
设定php简写功能的方法
2019/11/28 PHP
将string解析为json的几种方式小结
2010/11/11 Javascript
javascript整除实现代码
2010/11/23 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
Python中文编码知识点
2019/02/18 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
实习求职信
2013/12/01 职场文书
外贸业务员工作职责
2014/01/06 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
体育比赛口号
2014/06/09 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
行政处罚告知书
2015/07/01 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
golang json数组拼接的实例
2021/04/28 Golang
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android