立即注册 找回密码

QQ登录

只需一步,快速开始

第一站长论坛

搜索
1框架
查看: 111|回复: 0

PHP单例模式应用示例【多次连接数据库只实例化一次】

[复制链接]
发表于 2019-1-5 08:12 | 显示全部楼层 |阅读模式
本文实例讲述了PHP单例模式应用。分享给大家供大家参考,具体如下:
以前刚开始工作的时候经常连接数据库,每次用到数据库的时候就要用new进行实例并连接一次,当时因为连接数据库的次数不是很频繁,所以也没什么。后来主管对我说我现在这样每次都连接数据库的如果数据读取频繁的话对数据库和系统造成的压力会很大,让我想想办法能不能就连接一次数据库然后再次用到的时候就不消new一个新的连接了,当时怎么也没想到好的办法,知道最近学到了单例模式才恍然大悟,当时主管是引导我用单例模式的,只怪我以前对开发模式不懂。好了废话少说,下面来看单例模式:
单例模式(职责模式):
简单的说,一个对象(在学习设计模式之前,需要比力了解面向对象思想)只负责一个特定的任务;
单例类:
1、构造函数需要标志为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2、拥有一个保存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
另外,需要创建__clone()方法防止对象被复制(克隆)
为什么要使用PHP单例模式?
1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以制止大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而制止到处var_dump, echo。
代码(官方文档中的):
  1. [/code]效果:
  2. [indent]I am constructed!   Woof!
  3. Fatal error:
  4. Clone is not allowed. in E:\APMServ5.2.6\www\htdocs\Lee\myprogram\other\class\singletons.phpon line 31
  5. [/indent]以下内容源自网络(可以参考学习一下):
  6. [b]单例模式的三个要点:[/b]
  7. (1). 需要一个保存类的唯一实例的静态成员变量:
  8.  
  9. [code]private static $_instance;
复制代码
(2). 构造函数和克隆函数必须声明为私有的,防止外部步伐new类从而失去单例模式的意义:
  1. private function __construct() {   $this->_db = pg_connect('xxxx'); } private function __clone() { }//覆盖__clone()方法,禁止克隆
复制代码
(3). 必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
  1. public static function getInstance(){   if(! (self::$_instance instanceof self) )   {     self::$_instance = new self();   }   return self::$_instance;}
复制代码
二、为什么要使用单例模式?
1、PHP缺点:
PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被接纳。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.NET、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用步伐的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用步伐生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量照旧类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
2、单例模式在PHP中的应用场合:
(1)、应用步伐与数据库交互
一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以制止大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。
(2)、控制配置信息
如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现.
三、怎样实现单例模式?
1、普通的数据库访问例子:
  1. [/code]2、应用单例模式对数据库进行操作:
  2. [code]
复制代码
3、深入理解
[code][/code]更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象步伐设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP步伐设计有所帮助。

免责声明:如果侵犯了您的权益,请联系我们,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|第一站长论坛 ( 闽ICP备16019670号 )|申请友情链接

GMT+8, 2019-3-23 18:20 , Processed in 0.054860 second(s), 22 queries .

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc & Style Design

本站提供网上自由讨论使用,所有言论内容来自互联网并不代表本站立场,本站不负任何责任.
如发现有侵权行为,请与我们联系. 我们将立刻从网站上删除,并向所有持版权者致最深歉意.
联系QQ:2837195923

快速回复 返回顶部 返回列表