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 相关文章推荐
如何利用php+mysql保存和输出文件
Oct 09 PHP
解决中英文字符串长度问题函数
Jan 16 PHP
PHP数组对比函数,存在交集则返回真,否则返回假
Feb 03 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
Laravel中使用Queue的最基本操作教程
Dec 27 PHP
PDO::rollBack讲解
Jan 29 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
一个简单的域名注册情况查询程序
2006/10/09 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
python groupby 函数 as_index详解
2019/12/16 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
如何使用Python调整图像大小
2020/09/26 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
Android面试题及答案
2015/09/04 面试题
医学专业毕业生个人的求职信
2013/12/04 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
揭牌仪式主持词
2014/03/19 职场文书
求职信格式要求
2014/05/23 职场文书
社会实践的活动方案
2014/08/22 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
信访维稳承诺书
2015/05/04 职场文书
中学教师读书笔记
2015/07/01 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server