PHP中数据库单例模式的实现代码分享


Posted in PHP onAugust 21, 2014

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类。

单例模式的要点有三个:

一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。

下面我们讨论下为什么要使用PHP单例模式?

多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。

1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。

2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。

3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

class db {
  public static $cennct = null;
  private function __construct(){return false;}
  private function conn(){
    $pdo = new PDO('mysql:host=localhost;dbname=dbname','root','');
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);    
    $pdo->query('set names utf8');            
    return $pdo;                  
  }
  public static function getdb(){
    if(self::$cennct == null )
      self::$cennct = self::conn(); 
      return true;
  }
  protected function fetch($sql,$param=array()){
    $this->getdb();
    $tmp = self::$cennct->prepare($sql);
    $tmp->execute($param);
    return $tmp->fetch(PDO::FETCH_ASSOC);
  }
  protected function fetchAll($sql,$param=array()){
    $this->getdb();
    $tmp = self::$cennct->prepare($sql);
    $tmp->execute($param);
    return $tmp->fetchAll(PDO::FETCH_ASSOC);     
  }
  protected function execute($sql,$param=array()){
    $this->getdb(); 
    $tmp = self::$cennct->prepare($sql);
    return $tmp->execute($param);
  }
}

以上为一个数据库操作单例模式

PHP 相关文章推荐
非常不错的MySQL优化的8条经验
Mar 24 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
解析PHP 使用curl提交json格式数据
Jun 29 PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 PHP
php生成mysql的数据字典
Jul 07 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
PHP中的日期加减方法示例
Aug 21 #PHP
PHP中比较时间大小实例
Aug 21 #PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 #PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 #PHP
PHP实现的多彩标签效果代码分享
Aug 21 #PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 #PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 #PHP
You might like
实现树状结构的两种方法
2006/10/09 PHP
JavaScript中常见陷阱小结
2010/04/27 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
python 为什么说eval要慎用
2019/03/26 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
python 常见的排序算法实现汇总
2020/08/21 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
IBatis持久层技术
2016/07/18 面试题
如何进行有效的自我评价
2013/09/27 职场文书
大学总结自我鉴定
2014/01/18 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
学校文明单位申报材料
2014/05/06 职场文书
监察建议书格式
2014/05/19 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
结对共建协议书
2014/08/20 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle