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 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
php结合飞信 免费天气预报短信
May 07 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
Jun 17 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
PHP防止跨域提交表单
Nov 01 PHP
php防止sql注入代码实例
Dec 18 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
php抽奖概率算法(刮刮卡,大转盘)
Apr 17 PHP
php常用正则函数实例小结
Dec 29 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
组合算法的PHP解答方法
2012/02/04 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
Js 刷新框架页的代码
2010/04/13 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
Python实现ssh批量登录并执行命令
2016/10/25 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
解决yum对python依赖版本问题
2019/07/05 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
python实现翻译word表格小程序
2020/02/27 Python
Python socket处理client连接过程解析
2020/03/18 Python
python import 上级目录的导入
2020/11/03 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
四查四看剖析材料
2014/02/14 职场文书
《自选商场》教学反思
2014/02/14 职场文书
环保口号大全
2014/06/12 职场文书
匿名信格式范文
2015/05/27 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
寒假致家长的一封信
2015/10/10 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技