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 相关文章推荐
BBS(php &amp; mysql)完整版(七)
Oct 09 PHP
php基础知识:类与对象(1)
Dec 13 PHP
php sprintf()函数让你的sql操作更安全
Jul 23 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
Apache下禁止php文件被直接访问的解决方案
Apr 25 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
php实例分享之mysql数据备份
May 19 PHP
php获取图片信息的方法详解
Dec 10 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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/21 PHP
php rsa加密解密使用详解
2015/01/14 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
JS 自动安装exe程序
2008/11/30 Javascript
js function定义函数使用心得
2010/04/15 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
浅谈Python的文件类型
2016/05/30 Python
python中os模块详解
2016/10/14 Python
深入理解python中的atexit模块
2017/03/07 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
仓库门卫岗位职责
2013/12/22 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
高中课程设置方案
2014/05/28 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
办理信用卡工作证明
2014/09/30 职场文书
电影开国大典观后感
2015/06/04 职场文书
军训通讯稿范文
2015/07/18 职场文书