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生成带有雪花背景的验证码
Sep 28 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
php 求质素(素数) 的实现代码
Apr 12 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
PHP采集静态页面并把页面css,img,js保存的方法
Dec 23 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
May 12 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
如何使用PHP往windows中添加用户
2006/12/06 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
python中for语句简单遍历数据的方法
2015/05/07 Python
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python日志模块logging基本用法分析
2018/08/23 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
体育教师自荐信范文
2013/12/16 职场文书
医药营销个人求职信
2014/04/12 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
药品开票员岗位职责
2015/04/15 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python