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 相关文章推荐
jQuery 源码分析笔记
May 25 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
php实现zip文件解压操作
Nov 03 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
May 13 PHP
yii2实现根据时间搜索的方法
May 25 PHP
Yii2设置默认控制器的两种方法
May 19 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 PHP
PHP实现微信提现功能
Sep 30 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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数据库操作方法(MYSQL版)
2011/06/08 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
python实现网站的模拟登录
2016/01/04 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
后勤自我鉴定
2013/10/13 职场文书
小学科学教学反思
2014/01/26 职场文书
公司合作协议书范本
2014/04/18 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
会议通知范文
2015/04/15 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
话题作文之自信作文
2019/11/15 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技