1.什么是单例模式?

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

2.单例模式的三个要点

A.需要一个保存类的唯一实例的静态成员变量:

private static $_instance;

B.构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:

private function __construct()
{
} private function __clone()
{
}

C.必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用

public static function getInstance(){

    if (!(self::$_instance instanceof self)) {
self::$_instance = new self();
}
return self::$_instance;
}

3.为什么要使用单例模式?

A.PHP缺点:

PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

B.单例模式在PHP中的应用场合:

一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。

4.应用单例模式对数据库进行操作

/**
* 设计模式之单例模式(单例模式生成一个对象后,此对象可以被众多其它对象所使用)
* 使用场景:最常用的地方是数据库连接。
*
* $_instance 必须声明为 私有的静态变量
* 构造函数和析构函数 必须声明为 私有的,防止外部程序new类,从而失去单例模式的意义(减少内存消耗)
* getInstance()方法必须声明为 公有的,必须调用此方法,以返回实例的一个引用
*
* 知识:1.双冒号操作符(::)只能访问静态变量和静态函数;2.new实例化对象都会消耗内存
*/
class db { private $conn; /**
* 1.静态变量(static),保存全局实例
* 2.私有属性(private),为了避免类外直接 new实例化 调用
*/
private static $sql;
private static $_instance; /** 私有化构造函数,防止外界实例化对象 **/
private function __construct(){ require_once('db.config.php');
$this->conn = mysql_connect($conf['host'], $conf['user'], $conf['password']) OR die(mysql_error());
mysql_select_db($conf['database'], $this->conn) OR die(mysql_error()); mysql_query('SET NAMES '.$conf['charset'].';', $this->conn);
} /** 静态方法,单例访问统一入口 **/
public static function getInstance(){ if (!(self::$_instance instanceof self)) {
self::$_instance = new self();
}
return self::$_instance;
} /** 私有化克隆函数,防止外界克隆对象 **/
private function __clone(){} /** 解析条件语句 **/
private function _parseCondition($condition){ if(is_array($condition)){
$where = '';
foreach($condition as $k => $v){
$where.= "AND `".$k."` = '".$v."' ";
}
$where = '('.trim(ltrim($where, 'AND')).')';
}else{
$where = $condition;
}
return $where;
} /** 解析字段语句 **/
private function _parseFields($fields){ if(is_array($fields)){
$field = '';
foreach($fields as $rs){
$field .= ', `'.$rs.'`';
}
$field = trim(ltrim($field, ','));
}else{
$field = $fields;
}
return $field;
} /** 查询数据库 **/
public function select($table, $condition = array(), $field = array()){ $where = empty($condition) ? '' : ' WHERE '.$this->_parseCondition($condition);
$fields = empty($field) ? '*' : $this->_parseFields($field); self::$sql = 'SELECT '.$fields.' FROM '.$table.$where; $query = mysql_query(self::$sql, $this->conn);
$ary = array();
while($row = mysql_fetch_array($query, MYSQL_ASSOC)){
$ary[] = $row;
}
return $ary;
} /** 返回当前SQL语句 **/
public function getLastSql(){
return self::$sql;
}
}

5.测试代码

header('Content-Type:text/html; Charset=utf-8;');
$db = db::getInstance();
$list = $db->select('table', array(), array());
echo $db->getLastSql();
echo '<pre>';
print_r($list);
echo '</pre>';

注意:记得配置db.config.php的数据库数组值

PHP设计模式之单例模式(数据库访问)的更多相关文章

  1. 关于PHP建立数据库访问类的封装以及操作php单例模式连接数据库封装类

    建立数据库访问类的封装 <?php   class DBDA {     public $host = "localhost"; //服务器地址     public $ui ...

  2. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

  3. PHP中的设计模式:单例模式(译)

    原文链接:http://coderoncode.com/2014/01/27/design-patterns-php-singletons.html 单例模式用于限制类实例化到单个对象,当整个系统只需 ...

  4. Java设计模式03:常用设计模式之单例模式(创建型模式)

    1.  Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...

  5. php设计模式之单例模式

    单例模式顾名思义,就是只有一个实例.作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须自行 ...

  6. php设计模式:单例模式

    前些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理解了,设计模式这些的花点心思基本的是能够理解的,当然要 ...

  7. python设计模式之单例模式(一)

    前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...

  8. 数据库访问工具 DBUtl(公孙二狗)

    数据库访问工具 DBUtil DBUtil 用于简化数据库的访问,只要准备好配置文件,调用 DBUtil 的静态函数就能直接得到查询数据库的结果. 本文主要内容有: 数据库访问的思考 DBUtil 实 ...

  9. [PHP]PHP设计模式:单例模式

    单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符 ...

随机推荐

  1. NVelocity模板引擎学习笔记

    NVelocity模板引擎学习笔记 学习模板引擎有一段时间现在做一些总结

  2. HTTP Status 404 - No result defined for action com.hebky.oa.classEntity.action.EntitysAction and result input

    在开发中总遇到这个问题,No result defined for action:原因:Action中的属性值为空的时候,Struts2的默认拦截器会报错,但是又找不到input的Result,不能够 ...

  3. Servlet 浅谈(三)

    关于Session 关于http协议后面会有一系列文章专门介绍.这里就大概了解一下:首先需要知道一点:HTTP是无状态的. 什么是无状态呢? 客户与服务器建立连接.发出请求.得到响应.关闭连接.整个流 ...

  4. Arduino周边模块:传感器部件(温敏、光敏、湿敏)

    Arduino周边模块:传感器部件(温敏.光敏.湿敏) Arduino周边模块:传感器部件(温敏.光敏.湿敏) Arduino的模数转换 对于Arduino来说,它只认识数字量,模拟量对其来说就是一门 ...

  5. Jquery中bind和live.one,delegate的区别

    Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function ...

  6. wampserver配置memcache

    我用的环境是win7 64位的操作系统,wampserver也是64位,版本是2.5的,其中带的php版本是5.5的. 配置memcache的步骤: 第一步,先下载memcahed.exe和php_m ...

  7. SQL语句执行效率及分析

    查询效率分析:子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询.在这种情况下可以考虑用联接查询来取代.如果要用子查询,那就用EXISTS替代IN.用NOT EXISTS替代NOT IN. ...

  8. PHP学习笔记-数组(1)

    1-1 数组定义 1.什么是数组? 所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组 ...

  9. python 初学笔记 (一)

    初学python第一天,希望自己真正了解计算机语言,并且做出成效. 写下学习笔记,记录学习进度,娱乐学习,不断成长. python详细介绍: python是什么?运用到哪里?有哪些在使用它? pyth ...

  10. 不要在公共接口中传递STL容器

    最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...