PHP用单例模式实现一个数据库类

使用单例模式的出发点:  

  1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。

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

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

创造单例注意:

  1、一个雷只能有一个类对象(只能实例化一个对象)

  2、它必须自己创建这个实例

  3、它必须自行向整个系统提供这个实例

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

  5、 getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用

  6、拥有一个保存类的实例的静态成员变量

  7、PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收

  8、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)

  另外,需要创建__clone()方法防止对象被复制(克隆)

代码如下:

 1 <?php
 2 class Danli
 3 {
 4
 5 //保存类实例的静态成员变量
 6     private static $_instance;
 7
 8 //private标记的构造方法
 9     private function __construct()
10     {
11         echo ‘This is a Constructed method;‘;
12     }
13
14 //创建__clone方法防止对象被复制克隆
15     public function __clone()
16     {
17         trigger_error(‘Clone is not allow!‘, E_USER_ERROR);
18     }
19
20 //单例方法,用于访问实例的公共的静态方法
21     public static function getInstance()
22     {
23         if (!(self::$_instance instanceof self)) {
24             self::$_instance = new self;
25         }
26         return self::$_instance;
27     }
28
29     public function test()
30     {
31         echo ‘调用方法成功‘;
32     }
33
34 }
35
36 /*用new实例化private标记构造函数的类会报错
37 $danli = new Danli();
38
39 复制(克隆)对象将导致一个E_USER_ERROR
40 $danli_clone = clone $danli;
41 */
42
43
44 //正确方法,用双冒号::操作符访问静态方法获取实例
45 $danli = Danli::getInstance();
46 $danli->test();
47 ?>

运用单例模式实现一个数据库类:

 1 <?php
 2 class DBHelper
 3 {
 4     private $link;
 5     static private $_instance;
 6
 7     // 连接数据库
 8     private function __construct($host, $username, $password)
 9     {
10         $this->link = mysql_connect($host, $username, $password);
11         $this->query("SET NAMES ‘utf8‘", $this->link);
12         //echo mysql_errno($this->link) . ": " . mysql_error($link). "n";
13         //var_dump($this->link);
14         return $this->link;
15     }
16     private function __clone()
17     {
18     }
19     public static function get_class_nmdb($host, $username, $password)
20     {
21         //$connector = new nmdb($host, $username, $password);
22         //return $connector;
23
24         if (FALSE == (self::$_instance instanceof self)) {
25             self::$_instance = new self($host, $username, $password);
26         }
27         return self::$_instance;
28     }
29     // 连接数据表
30     public function select_db($database)
31     {
32         $this->result = mysql_select_db($database);
33         return $this->result;
34     }
35     // 执行SQL语句
36     public function query($query)
37     {
38         return $this->result = mysql_query($query, $this->link);
39     }
40     // 将结果集保存为数组
41     public function fetch_array($fetch_array)
42     {
43         return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
44     }
45     // 获得记录数目
46     public function num_rows($query)
47     {
48         return $this->result = mysql_num_rows($query);
49     }
50     // 关闭数据库连接
51     public function close()
52     {
53         return $this->result = mysql_close($this->link);
54     }
55 }
56 $connector = DBHelper::get_class_nmdb($host, $username, $password);
57 $connector -> select_db($database);
58 ?>

也可以参考这个类实现:

 1 <?php
 2 /*
 3 * mysql 单例
 4 */
 5 class mysql{
 6     private $host    =‘localhost‘; //数据库主机
 7     private $user     = ‘root‘; //数据库用户名
 8     private $pwd     = ‘‘; //数据库用户名密码
 9     private $database = ‘imoro_imoro‘; //数据库名
10     private $charset = ‘utf8‘; //数据库编码,GBK,UTF8,gb2312
11     private $link;             //数据库连接标识;
12     private $rows;             //查询获取的多行数组
13     static $_instance; //存储对象
14     /**
15      * 构造函数
16      * 私有
17      */
18     private function __construct($pconnect = false) {
19         if (!$pconnect) {
20             $this->link = @ mysql_connect($this->host, $this->user, $this->pwd) or $this->err();
21         } else {
22             $this->link = @ mysql_pconnect($this->host, $this->user, $this->pwd) or $this->err();
23         }
24         mysql_select_db($this->database) or $this->err();
25         $this->query("SET NAMES ‘{$this->charset}‘", $this->link);
26         return $this->link;
27     }
28     /**
29      * 防止被克隆
30      *
31      */
32     private function __clone(){}
33     public static function getInstance($pconnect = false){
34         if(FALSE == (self::$_instance instanceof self)){
35             self::$_instance = new self($pconnect);
36         }
37         return self::$_instance;
38     }
39     /**
40      * 查询
41      */
42     public function query($sql, $link = ‘‘) {
43         $this->result = mysql_query($sql, $this->link) or $this->err($sql);
44         return $this->result;
45     }
46     /**
47      * 单行记录
48      */
49     public function getRow($sql, $type = MYSQL_ASSOC) {
50         $result = $this->query($sql);
51         return @ mysql_fetch_array($result, $type);
52     }
53     /**
54      * 多行记录
55      */
56     public function getRows($sql, $type = MYSQL_ASSOC) {
57         $result = $this->query($sql);
58         while ($row = @ mysql_fetch_array($result, $type)) {
59             $this->rows[] = $row;
60         }
61         return $this->rows;
62     }
63     /**
64      * 错误信息输出
65      */
66     protected function err($sql = null) {
67         //这里输出错误信息
68         echo ‘error‘;
69         exit();
70     }
71 }
72 //用例
73 $db = mysql::getInstance();
74 $db2 = mysql::getInstance();
75 $data = $db->getRows(‘select * from blog‘);
76 //print_r($data);
77 //判断两个对象是否相等
78 if($db === $db2){
79     echo ‘true‘;
80 }
81 ?>

PHP单例模式的缺点
 众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级

的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面

级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

时间: 2024-12-21 16:55:22

PHP用单例模式实现一个数据库类的相关文章

刚整了一个数据库操作类,但是可以用吗?

今天闲来无事,把以前自己搞的一个数据库操作类重新整理了一下,把命名规范了一下,位置和功能重新规划了一下. 源代码下载:http://files.cnblogs.com/xiaoshuai1992/xsFrameWork.SqlServer.zip 请先看图片和介绍 DbOperate文件夹 DbAccess类:核心类,运用Ado.net 对数据库进行操作. DbInParameter :传入DbAccess的参数,如参数,sql语句,sp名称,sp是执行还是返回数据. DbOutParamete

一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER

最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库.读数据表.执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢. ADOOperate.H [cpp] view plaincopy ////////////////////////////////////////////////////////////////////// // 类功能:用于数据库的操作 主要实现 连接数据库 读数据表 检查数据表 执行SQL语句 //

dede数据库类使用方法

dede数据库类使用方法 $dsql dedecms的数据库操作类,非常实用,在二次开发中尤其重要,这个数据库操作类说明算是奉献给大家的小礼物了. 引入common.inc.php文件 1 require_once (dirname(__FILE__) . "/include/common.inc.php"); 获取一条记录的内容 1 2 $row = $dsql->GetOne("Select * From dede_* where id = $aid");

OrmLite动态创建表,一个实体类创建多张表的的偏招

在做一个Android的项目,因为使用数据库频繁,实体字段也比较多,于是打算采用ORM框架,发现OrmLite还不错,于是下了下来,打算使用. 没想到还没正式开工,就遇到问题了.我现在的一个需求如下, 我有一个实体类如下,代表聊天消息,现在要做的是针对每一个当前用户(userId)对应一个朋友(friendId)都要创建一个表.需求比较蛋疼,我本来想的是直接在加两个字段就搞定的,但是我们老大说要分表.没办法只能分表. public class ChatMessage{ public ChatMe

dede数据库类使用方法 $dsql

dedecms的数据库操作类,非常实用,在二次开发中尤其重要,这个数据库操作类说明算是奉献给大家的小礼物了. 引入common.inc.php文件 1 require_once (dirname(__FILE__) . "/include/common.inc.php"); 获取一条记录的内容 1 2 $row = $dsql->GetOne("Select * From dede_* where id = $aid"); echo $row['id']; 将

Dedesql数据库类详解

今天花点时间讲解下织梦的sql数据库类,近期本来是准备录制一套视频教程的,但由于视频压缩的问题迟迟没有开展工作,如果大家有什么好的视频压缩方式可以通过邮件的方式告诉我:tianya#dedecms.com(#<=>@).目前视频主要想做成wmv或者rmvb这种格式的,里面含有ppt文档以及课程的相关附件. 其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结

CodeIgniter自带的数据库类使用介绍

在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 依据你的数据库配置载入并初始化数据库类:偏关县信访局 view source print? 1 $this->load->database(); 被载入之后你可以在任何地方使用它. 以对象形式返回查询结果 view source print? 01 $query = $this->db->query('SELECT name, title, emai

CodeIgniter框架——数据库类(配置+快速入门)

CodeIgniter用户指南——数据库类 数据库配置 入门:用法举例 连接数据库 查询 生成查询结果 查询辅助函数 Active Record 类 事务 表格元数据 字段元数据 自定义函数调用 查询缓存 数据库维护类 数据库工具类 1.数据库配置 CodeIgniter 有一个配置文件让你存放数据库连接值(username:用户名,password:密码,database name:数据库名,等等..). 该配置文件位于application/config/database.php. 你也可以

Dedesql数据库类详解(二次开发必备教程)(转)

http://www.dedecms.com/help/development/2009/1028/1076.html 织梦DedeCMS的二次开发不仅仅是会写写织梦的标签,会制作织梦的模板.很多时候,我们需要对织梦DedeCMS的数据库进行查询.插入.删除等等之类的操作,进行这一类的操作之前,我们必须知道织梦DedeCMS的数据库类,No牛网整理了织梦天涯版主关于DedeCMS程序的dedesql类常见的用法讲解的文章,希望有朋友用的上. 1.创建数据表 为了让讲解更加的贴合实际,天涯版主创建