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经典的给图片加水印程序
Dec 06 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
定义php常量的详解
Jun 09 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
PHP与MYSQL中UTF8编码的中文排序实例
Oct 21 PHP
PHP浮点数精度问题汇总
May 13 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
php二维码生成
Oct 19 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
PHP的cookie与session原理及用法详解
Sep 27 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
详解vuex的简单使用
2018/03/12 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
Python实现获取某天是某个月中的第几周
2015/02/11 Python
python发送HTTP请求的方法小结
2015/07/08 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
应聘护士自荐信
2013/10/21 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
经营场所使用证明
2015/06/19 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
MySQL系列之十一 日志记录
2021/07/02 MySQL
python对文档中元素删除,替换操作
2022/04/02 Python