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 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
php中几种常见安全设置详解
Apr 06 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 PHP
php文件读取方法实例分析
Jun 20 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
yii2带搜索功能的下拉框实例详解
May 12 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 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
推荐一篇入门级的Class文章
2007/03/19 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
PHP 程序员的调试技术小结
2009/11/15 PHP
浅谈php冒泡排序
2014/12/30 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python生成随机密码
2015/03/10 Python
Python3 中文文件读写方法
2018/01/23 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
英国网上购买门:Direct Doors
2018/06/07 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
what is the difference between ext2 and ext3
2013/11/03 面试题
广告设计专业自荐信范文
2013/11/14 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
部队万能检讨书
2014/02/20 职场文书
车辆工程专业求职信
2014/04/28 职场文书
经典团队口号
2014/06/06 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
java解析XML详解
2021/07/09 Java/Android
MySQL如何使备份得数据保持一致
2022/05/02 MySQL