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 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
WML,Apache,和 PHP 的介绍
Oct 09 PHP
轻松修复Discuz!数据库
May 03 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
PHP命名空间(Namespace)简明教程
Jun 11 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
Yii框架页面渲染操作实例详解
Jul 19 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 PHP
php 实现银联商务H5支付的示例代码
Oct 12 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
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP钩子实现方法解析
2019/05/21 PHP
Array对象方法参考
2006/10/03 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
怎样创建、运行java程序
2014/08/01 面试题
小学生考试获奖感言
2014/01/30 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android