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 相关文章推荐
PHP实现的功能是显示8条基色色带
Oct 09 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
php过滤XSS攻击的函数
Nov 12 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
php动态函数调用方法
May 21 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
Zend Framework分发器用法示例
Dec 11 PHP
使用vs code编辑调试php配置的方法
Jan 29 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 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
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
jquery的each方法使用示例分享
2014/03/25 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
js实现右键菜单功能
2016/11/28 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
JS实现简易日历效果
2021/01/25 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
详解Python sys.argv使用方法
2019/05/10 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python内置函数locals和globals对比
2020/04/28 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Django数据库迁移常见使用方法
2020/11/12 Python
python爬取youtube视频的示例代码
2021/03/03 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
新春寄语大全
2014/04/09 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
JS setTimeout与setInterval的区别
2022/04/20 Javascript