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中使用模板的方法
May 24 PHP
PHP原理之异常机制深入分析
Aug 08 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
PHP实现批量删除(封装)
Apr 28 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
PHP时间函数使用详解
Mar 21 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定时执行计划任务的多种方法小结
2011/12/19 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python动态网页批量爬取
2016/02/14 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
django最快程序开发流程详解
2019/07/19 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
Python如何重新加载模块
2020/07/29 Python
全球性的女装店:storets
2019/06/12 全球购物
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
《匆匆》教学反思
2014/02/22 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
毕业生对母校寄语
2015/02/26 职场文书
2015国庆节感想
2015/08/04 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
Python的三个重要函数详解
2022/01/18 Python