php设计模式——单例模式

时间:2022-09-21 22:00:27

单例模式概念

单例模式是指整个应用中类只有一个对象实例的设计模式。

单例模式的特点

  • 一个类在整个应用中只有一个实例
  • 类必须自行创建这个实例
  • 必须自行向整个系统提供这个实例

php中使用单例模式的原因

我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。
贴出我之前常用的不好的数据库连接代码,给大家一个错误示范:
  1. <?php
  2. class MysqlConn
  3. {
  4. // MYSQL数据库连接信息
  5. const MYSQLHOSTNAME = "127.0.0.1";
  6. const MYSQLUSERNAME = "root";
  7. const MYSQLPASSWORD = "***";
  8. const MYSQLDBNAME = "test";
  9. const MYSQLCHARSET = "utf8";
  10. /**
  11. * Description:mysql数据库连接函数
  12. * Return value:连接成功返回数据库连接句柄;连接失败返回错误消息
  13. */
  14. public function MysqlConnect()
  15. {
  16. $db = new mysqli(self::MYSQLHOSTNAME, self::MYSQLUSERNAEM, self::MYSQLPASSWORD, self::MYSQLDBNAME); // 连接数据库
  17. $db->set_charset(self::MYSQLCHARSET);
  18. if (mysqli_connect_errno())
  19. {
  20. throw new CircleMysqlException("服务器系统故障", 1001);
  21. }
  22. else
  23. {
  24. return $db;
  25. }
  26. }
  27. }

缺陷:

每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回close掉,频繁的new和数据库连接关闭操作是非常消耗资源的

改进:

每次应该直接返回当前应用中已经打开的数据库连接句柄

  1. //单例模式返回数据库连接句柄
  2. $db = MysqlConn::SingleMysqlConnect();

php单例模式的实现

  1. <?php
  2. class Singleton
  3. {
  4. /**
  5. * Description:(1)静态变量,保存全局实例,跟类绑定,跟对象无关
  6. *             (2)私有属性,为了避免类外直接调用 类名::$instance,防止为空
  7. */
  8. private static $instance;
  9. /**
  10. * Description:数据库连接句柄
  11. */
  12. private $db;
  13. /**
  14. * Description:私有化构造函数,防止外界实例化对象
  15. */
  16. private static function __construct()
  17. {
  18. }
  19. /**
  20. * Description:私有化克隆函数,防止外界克隆对象
  21. */
  22. private function __clone()
  23. {
  24. }
  25. /**
  26. * Description:静态方法,单例访问统一入口
  27. * @return Singleton:返回应用中的唯一对象实例
  28. */
  29. public static function GetInstance()
  30. {
  31. if (!(self::$instance instanceof self))
  32. {
  33. self::$instance = new self();
  34. }
  35. return self::$instance;
  36. }
  37. /**
  38. * Description:获取数据库的私有方法的连接句柄
  39. */
  40. public function GetDbConnect()
  41. {
  42. return $this->db;
  43. }
  44. }
  • 需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)
  • 构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义
  • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

php设计模式——单例模式的更多相关文章

  1. 设计模式 单例模式&lpar;Singleton&rpar; &lbrack; 转载2 &rsqb;

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式&lpar;Singleton&rpar; &lbrack; 转载 &rsqb;

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. c&num;设计模式-单例模式&lpar;面试题&rpar;

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式&lpar;一&rpar;

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. php实现设计模式————单例模式

    php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...

  10. JAVA设计模式-单例模式&lpar;Singleton&rpar;线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

随机推荐

  1. 用Middleware给ASP&period;NET Core Web API添加自己的授权验证

    Web API,是一个能让前后端分离.*后端生产力的好东西.不过大部分公司应该都没能做到完全的前后端分离.API的实现方式有很 多,可以用ASP.NET Core.也可以用ASP.NET Web ...

  2. &lbrack;deviceone开发&rsqb;-do&lowbar;SegmentView和do&lowbar;SlideView联动的示例

    一.简介 示例展示do_SegmentView和do_SlideView联动的使用,这二个组件很常用,而且这个组合也非常常用,类似网易新闻的效果,上面滑动带动下面的slideview滑动,反过来也是. ...

  3. mongoDB在windows下安装与配置方案

    首先在官网下载mongoDB的安装包: https://www.mongodb.org/downloads 百度云盘下载:http://pan.baidu.com/s/1slUSGYp (安装版 wi ...

  4. php分享(三十六)mysql中关联表更新

    一:关联不同的表更新 1: 通过where关联更新 update student s, city c set s.province_name = c.province_name, s.city_nam ...

  5. SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案

    SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...

  6. INNO setup安装卸载钱判断进程中是否在运行总结

    1.安装前判断进程中是否有程序在运行. [files] ; 安装前判断进程,dll文件放在inno的安装目录中Source: compiler:psvince.dll; Flags: dontcopy ...

  7. 菜鸟教程之工具使用(十四)——Maven项目右击没有&OpenCurlyDoubleQuote;Maven”菜单选项

    从Git导入一个Maven项目,右击想更新Maven引用的jar包,却发现右键菜单根本没有“Maven”菜单项.怎么办?很简单,按如下步骤操作即可: 从Git导入后,右击项目没有“Maven”菜单项: ...

  8. xadmin的插件机制

    xadmin的视图方法中如果加了@filter_hook 标记的都可以作为插件的钩子函数. 例如在ListAdminView类中有许多加了上述标记的方法, @filter_hook def get_c ...

  9. &lbrack;Deep Learning&rsqb; 正则化

    在总结正则化(Regularization)之前,我们先谈一谈正则化是什么,为什么要正则化. 个人认为正则化这个字眼有点太过抽象和宽泛,其实正则化的本质很简单,就是对某一问题加以先验的限制或约束以达到 ...

  10. H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入

    一: 1.鼠标监视坐标值 <!DOCTYPE html> <head> <meta charset=UTF-8> <title>canvas的演示&lt ...