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 相关文章推荐
PHP5.2下chunk_split()函数整数溢出漏洞 分析
Jun 06 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
php 时间计算问题小结
Jan 04 PHP
php压缩多个CSS为一个css的代码并缓存
Apr 21 PHP
PHP面向对象法则
Feb 23 PHP
php遍历数组的方法分享
Mar 22 PHP
PHP array_multisort() 函数的深入解析
Jun 20 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
PDO的安全处理与事物处理方法
Oct 31 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 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
curl和libcurl的区别简介
2015/07/01 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
jquery 插件学习(六)
2012/08/06 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
socket + select 完成伪并发操作的实例
2017/08/15 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
python 实现矩阵按对角线打印
2019/11/29 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
pycharm导入源码的具体步骤
2020/08/04 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
车间副主任岗位职责
2013/12/24 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
酒店开业策划方案
2014/06/02 职场文书
观后感格式
2015/06/19 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server