PHP单例模式在MVC框架设计中的应用
2012-05-11 21:54
661 查看
MVC的controller层中会对不同的model对象进行操作,而这些对象往往分别在操作不同的数据库,所以在每个model中需要使用特定的数据库,但是在每个model层中实例化一个数据库连接对象是不明智的:因为数据库连接资源在所有设计优良的系统中都是稀缺资源,所以我们尽量的在一个php页面执行过程中对一个数据库仅仅建立一个连接。
在未接触单例模式之前,我为了数据库连接对象的传递方便,将数据库连接的事情放在了contrller层的action中来处理,虽然在非框架编程中我们往往在页面的最开始会建立数据库,这么做也符合大多数开发人员的使用习惯,但是往往忽略了一点,因为在controller层中,数据库连接对象是没有具体使用的,controller层仅仅为了对象的传递需要做了数据库连接的事情,这不符合面向对象的设计思路。
下面介绍以下单例模式及其设计方向:
单例模式顾名思义,就是只有一个实例。
作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统(整个页面执行过程)提供这个实例。
就我目前应用到的情况,单例模式可以应用于下面两种情况:
1.用一个类来管理数据库连接:这个类管理的可以是一个
class Db {
privatestatic
$dbhs; //私用静态数据库句柄的数组集合。我们用数组下标来区别不同的数据库连接。然后通过私有的构造函数来实例化这个类的变量。通过公用的静态实例方法来调用构造函数
privatefunction
__construct($dbconfig)
{
return new pdo($dbconfig);
}
publicstatic
function singleton($key) { //key为数据库标识串 入 passport读库 "pp_r"
if (!self::$dbh[$key]) {
self::$dbh[$key]=new
db($dbconfig);
}
return self::$dbh[$key];
}
}
该类就用了 $dbhs 来保存多个数据库连接 ,通过调用 singleton方法来获取特定库的连接句柄进行数据库操作。
2.在MVC框架中用来保存全局的系统级配置变量:这样就不需要使用使用global 全局变量来传递全局变量数组。直接用一个类来保存配置文件信息,这样就不需要在Controller层或者model层中使用全局配置时不停的使用全局变量声明。
如一个Sysconfig的类如下 sysconfig.class.php
class Sysconfig {
$private static $config = require 'sys.config.php'; //sys.config <?php return array('domain' =>'http://www.example.com/',....);
privatefunction
__construct() {}
publicstatic
function singleton() { //key为数据库标识串 入 passport读库 "pp_r"
return
self::$sysconfig;
}
}
在MVC框架的开始调度文件中 (dispather.php)
首先loadClass ('sysconfig'); //封装的加载类文件的函数 实现include功能
然后在框架的任意一层M或者V或者C(未二次封装,如smarty)中:可以任意使用
如 $dbconfig =Sysconfig::singleton;
$domain = $dbconfig['domain'];了。
说到底,最有用的还是第一条,因为它在一个MVC的框架中是很重要的一步。
在未接触单例模式之前,我为了数据库连接对象的传递方便,将数据库连接的事情放在了contrller层的action中来处理,虽然在非框架编程中我们往往在页面的最开始会建立数据库,这么做也符合大多数开发人员的使用习惯,但是往往忽略了一点,因为在controller层中,数据库连接对象是没有具体使用的,controller层仅仅为了对象的传递需要做了数据库连接的事情,这不符合面向对象的设计思路。
下面介绍以下单例模式及其设计方向:
单例模式顾名思义,就是只有一个实例。
作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统(整个页面执行过程)提供这个实例。
就我目前应用到的情况,单例模式可以应用于下面两种情况:
1.用一个类来管理数据库连接:这个类管理的可以是一个
class Db {
privatestatic
$dbhs; //私用静态数据库句柄的数组集合。我们用数组下标来区别不同的数据库连接。然后通过私有的构造函数来实例化这个类的变量。通过公用的静态实例方法来调用构造函数
privatefunction
__construct($dbconfig)
{
return new pdo($dbconfig);
}
publicstatic
function singleton($key) { //key为数据库标识串 入 passport读库 "pp_r"
if (!self::$dbh[$key]) {
self::$dbh[$key]=new
db($dbconfig);
}
return self::$dbh[$key];
}
}
该类就用了 $dbhs 来保存多个数据库连接 ,通过调用 singleton方法来获取特定库的连接句柄进行数据库操作。
2.在MVC框架中用来保存全局的系统级配置变量:这样就不需要使用使用global 全局变量来传递全局变量数组。直接用一个类来保存配置文件信息,这样就不需要在Controller层或者model层中使用全局配置时不停的使用全局变量声明。
如一个Sysconfig的类如下 sysconfig.class.php
class Sysconfig {
$private static $config = require 'sys.config.php'; //sys.config <?php return array('domain' =>'http://www.example.com/',....);
privatefunction
__construct() {}
publicstatic
function singleton() { //key为数据库标识串 入 passport读库 "pp_r"
return
self::$sysconfig;
}
}
在MVC框架的开始调度文件中 (dispather.php)
首先loadClass ('sysconfig'); //封装的加载类文件的函数 实现include功能
然后在框架的任意一层M或者V或者C(未二次封装,如smarty)中:可以任意使用
如 $dbconfig =Sysconfig::singleton;
$domain = $dbconfig['domain'];了。
说到底,最有用的还是第一条,因为它在一个MVC的框架中是很重要的一步。
相关文章推荐
- PHP单例模式在MVC框架设计中的应用 (
- 设计模式之PHP项目应用——简单工厂模式设计计算器
- PHP单元素设计模式的原理及应用解析
- 145 php 设计模式代码和应用场景实例
- 23种设计模式(11):命令模式在MVC框架中的应用
- php常用几种设计模式的应用场景
- 设计模式之php项目应用
- php实现设计模式中的单例模式详解(还是不懂,那些所谓的应用场景,有没有人来讨论一下)
- php设计模式之单例、多例设计模式的应用分析
- 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
- 5. php设计模式:策略模式的实际应用
- php在设计模式中的应用之单例模式
- 设计模式之PHP项目应用——策略模式设计自动驾驶系统
- 基于php设计模式中单例模式的应用分析
- 设计模式之PHP项目应用——策略模式设计商场收银系统
- php设计模式之单例、多例设计模式的应用分析
- php设计模式之观察者模式的应用详解
- 基于php设计模式中单例模式的应用分析
- php设计模式之命令模式的应用详解
- PHP中的设计模式及其实际应用浅析