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 不同编码下的字符串长度区分
Sep 26 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
php cli配置文件问题分析
Oct 15 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
php数组指针操作详解
Feb 14 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP代码重构方法漫谈
Apr 17 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php 生成短网址原理及代码
2014/01/23 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
Vue使用NProgress进度条的方法
2019/09/21 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python程序控制NAO机器人行走
2019/04/29 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
高中自我评价分享
2013/12/05 职场文书
2014年保密工作总结
2014/11/22 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
学校捐书活动总结
2015/05/08 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
python tkinter实现定时关机
2021/04/21 Python
Mybatis是这样防止sql注入的
2021/12/06 Java/Android
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技