PHP单例模式详解及实例代码


Posted in PHP onDecember 21, 2016

PHP单例模式详解

单例模式的概念

单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

单例模式的特点

单例模式的主要特点是“三私一公”:

需要一个保存类的唯一实例的私有静态成员变量

构造函数必须声明为私有的,防止外部程序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 29 PHP
工厂模式在Zend Framework中应用介绍
Jul 10 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
Jul 18 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
PHP执行linux命令常用函数汇总
Feb 02 PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 PHP
php基于curl实现的股票信息查询类实例
Nov 11 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
PHP实现常用排序算法的方法
Feb 05 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 #PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 #PHP
php获取POST数据的三种方法实例详解
Dec 20 #PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 #PHP
Discuz论坛密码与密保加密规则
Dec 19 #PHP
yii框架搜索分页modle写法
Dec 19 #PHP
YII框架中搜索分页jQuery写法详解
Dec 19 #PHP
You might like
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
Joomla开启SEF的方法
2016/05/04 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
用Python抢过年的火车票附源码
2015/12/07 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
台湾旅游网站:灿星旅游
2018/10/11 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
教职工代表大会主持词
2014/04/01 职场文书
2015年中个人总结范文
2015/03/10 职场文书
收入证明怎么写
2015/06/12 职场文书
五一放假通知怎么写
2015/08/18 职场文书