工厂模式在Zend Framework中应用介绍


Posted in PHP onJuly 10, 2012

首先我们先引用些概念:
工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有其同的父类。工厂模式属于类的创建模式,通常根据自变量的不同返回不同类的实例。
工厂模式的实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品的实例。工厂模式式涉及到工厂角色、抽象产品角色和具体产品角色。
工厂(Creator)角色:是工厂模式的核心,它负责实现创建所有实例的内部逻。工厂类可以被外界直接调用,创建所需产品对象。
抽象产品(Product)角色:是工厂模式所创建所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:是工厂模式的创建目标,所有的对象都是充当这个角色的某个具体类的实例。
ZF中的zend_db就是工厂模式的一个很好的例子。
接下来就开始进行分析。。。。。。
配置zf的时候,我们可以将数据库的连接操作信息放在Bootstrap.php文件中

<?php 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
function __construct($app){ 
parent::__construct($app); 
$url=constant('APPLICATION_PATH').DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'config.ini'; 
$dbconfig=new Zend_Config_Ini($url,null,true); 
$db=Zend_Db::factory($dbconfig->general->db->adapter,$dbconfig->general->db->params->toArray()); 
// var_dump($db); 
$db->query('SET NAMES UTF8'); 
Zend_Db_Table::setDefaultAdapter($db); 
} 
} 
?>

在入口文件处,通过一个Zend_Application对象来调用bootstrap(),类Bootstrap的构造函数就会被调用。
在构造函数中,通过Zend_Db::factory()我们就能得到一个操作数据库的对象实例。
通过一个Zend_Config_Ini 实例读取config.ini中相关信息作为参数传递给工厂函数Zend_Db::factory()
config.ini 的信息
[general]
db.adapter =PDO_MYSQL
db.params.host =localhost
db.params.username =root
db.params.password =
db.params.dbname = 数据库名
Zend_Db::factory()
其中参数一:表示要操作的数据库类型,比如PDO_MYSQL
参数二:表示连接数据库的信息,包括服务器名,用户名,密码,要连接的数据库

先抛出两个提个问题:
①如果我们要操作的数据库是MSSQL,该怎么操作
②这里我们使用的是Zend_Db::factory(),如果我们使用传统的方式,该怎么操作

解答:
① 我们只需要在config.ini文件中将PDO_MYSQL修改成PDO_MSSQL即可
② 传统方式创建一个操作数据库的对象实例:
$db=new Zend_Db_Adapter_Pdo_Mysql($config)
其中:$config信息从config.ini中读取
问题来了:我们使用传统的方式来创建一个对象实例的话,我们必然有一个流程来判断当前要操作的数据库类型吧?
比如:

switch ($dbType){ 
case 'PDO_MYSQL': 
.... 
case 'PDO_MSSQL': 
.... 
case 'PDO_SQLITE': 
.... 
}

我们还得根据不同的数据库类型,写不同的操作数据库的语句,这样岂不是很麻烦
但是,这一切的一切,zf通过工厂模式都已经帮我们做好了,使用起来非常方便

Zf中如何是如何实现工厂模式的呢?
首先,得有一个抽象基类:Zend_Db_Adapter_Abstract,该类是工厂模式所创建的所有对象的父类,他负责提供所有实例要所共有的接口。
该类不仅提供了一些我们非常熟悉操作数据库的实现方法,比如:select,update,insert,delete,query,fetchRow,fetchAssoc;另外,也提供了一些接口,用以在子类中进行实现,比如:limit,getServerVersion,closeConnection,describeTable等等

abstract class Zend_Db_Adapter_Abstract 
{ 
//.. 
} 
abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract 
{ 
//.. 
} 
class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract 
{ 
//...实现针对Mysql数据库的操作 
} 
class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract 
{ 
//....实现针对Mssql数据库的操作 
} 
class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract 
{ 
//....实现针对Sqlite数据库的操作 
}

以上关系可以用一张图简单的表示出来

工厂模式在Zend Framework中应用介绍
接下来,我们跟踪下Zend_Db::Factory()到底是实现根据不同的参数选择不同的数据库的。

工厂模式在Zend Framework中应用介绍

PHP 相关文章推荐
php+mysql事务rollback&amp;commit示例
Feb 08 PHP
PHP中=赋值操作符对不同数据类型的不同行为
Jan 02 PHP
PHP删除数组中的特定元素的代码
Jun 28 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
php网页病毒清除类
Dec 08 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 #PHP
php数据库配置文件一般做法分享
Jul 07 #PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 #PHP
php中CI操作多个数据库的代码
Jul 05 #PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 #PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 #PHP
php Ubb代码编辑器函数代码
Jul 05 #PHP
You might like
PHP教程 基本语法
2009/10/23 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
python实现逐个读取txt字符并修改
2018/12/24 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
医校毕业生自我鉴定
2014/01/25 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
产品推广策划方案
2014/05/10 职场文书
土建工程师岗位职责
2014/06/10 职场文书
公司周年庆活动方案
2014/08/25 职场文书
就业意向协议书
2015/01/29 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python