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 相关文章推荐
Discuz 模板引擎的封装类代码
Jul 18 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
PHP常用的缓存技术汇总
May 05 PHP
destoon之一键登录设置
Jun 21 PHP
Joomla简单判断用户是否登录的方法
May 04 PHP
php+ajax无刷新上传图片的实现方法
Dec 06 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
PHP 8新特性简介
Aug 18 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
php设计模式 Visitor 访问者模式
2011/06/28 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
PHP _construct()函数讲解
2019/02/03 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
详解微信小程序中组件通讯
2018/10/30 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
Python装饰器用法实例分析
2019/01/14 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
班组长安全生产职责
2013/12/16 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
晚会邀请函范文
2014/01/24 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
东京审判观后感
2015/06/01 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA