PHP中单例模式的使用场景与使用方法讲解


Posted in PHP onMarch 18, 2019

单例模式按字面来看就是指某一个类只存在一个实例,这一点其实是与静态方法是相同的,只存在一个实例的好处是当我们需要使用某个类时只需要实例化一次,不需要每次都去new,极大的降低了资源的耗费,比如说数据库的连接类。

一个类只有一个对象实例含义  

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

那么单例模式与静态方法有什么区别呢?

个人观点,如果不存在比较复杂的事务管理,用singleton会比较好,原因有三:

  • 1、单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);
  • 2、单例可以被延迟初始化,静态类一般在第一次加载是初始化;
  • 3、单例模式在使用中比静态方法更灵活;

虽然这样说,但到底该选用单例还是静态,我们还需要视实际情况而定,在设计模式中我们应该做到的是:减少代码,增加稳定,方便理解,提升性能,减少开销。

扯远了,下面我们说回PHP中单例模式的使用。

单例类至少拥有以下三种公共元素:

  • 1、必须拥有一个构造函数,并且必须被标记为private。
  • 2、拥有一个保存类的实例的静态成员变量。
  • 3、拥有一个访问这个实例的公共的静态方法。

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。

单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。

单例模式有以下3个特点:

1.只能有一个实例。

2.必须自行创建这个实例。

3.必须给其他对象提供这一实例。

那么为什么要使用PHP单例模式?

PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。

具体使用例子:

<?php
/**
 * by 3water.com
 */
class Mysql{
 //该属性用来保存实例
 private static $instance;
 private $conn;
 //构造函数为private,防止创建对象
 private function __construct(){
 $this->conn = mysql_connect('localhost','root','123456');
 //...
 }
 //创建一个用来实例化对象的方法
 public static function getInstance(){
 if(!(self::$instance instanceof self)){
  self::$instance = new self;
 }
 return self::$instance;
 }
 //防止对象被复制
 public function __clone(){
 trigger_error('Clone is not allowed !');
 }
 //...
 public function query(){
 //do something
 }
}
//使用单例调用类中的方法,不能new 和 clone
Mysql::getInstance()->query();
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
dedecms中常见问题修改方法总结
Mar 21 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
Feb 26 PHP
PHP错误机制知识汇总
Mar 24 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
Jul 26 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 PHP
详解php中curl返回false的解决办法
Mar 18 #PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 #PHP
PHP自动生成缩略图函数的源码示例
Mar 18 #PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 #PHP
PHP实现对数字分隔加千分号的方法
Mar 18 #PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 #PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php实现复制移动文件的方法
2015/07/29 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
js获取单选按钮的数据
2006/11/27 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
Javascript之String对象详解
2016/06/08 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
Python configparser模块常用方法解析
2020/05/22 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
优秀学生评语大全
2014/04/25 职场文书
高中学生评语大全
2014/04/25 职场文书
员工年终考核评语
2014/12/31 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书