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
PHP怎样调用MSSQL的存储过程
Oct 09 PHP
php学习笔记之 函数声明
Jun 09 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
Jun 08 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
PHP常见数组排序方法小结
Aug 20 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中调用JAVA
2006/10/09 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
拖动一个HTML元素
2006/12/22 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
Python实时获取cmd的输出
2015/12/13 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python实现数据库跨服务器迁移
2018/04/12 Python
Python多继承顺序实例分析
2018/05/26 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
写演讲稿要注意的六件事
2014/01/14 职场文书
大学生求职自我评价
2014/01/16 职场文书
南京青奥会口号
2014/06/12 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
患者身份识别制度
2015/08/06 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers