工厂模式在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 相关文章推荐
探讨如何在php168_cms中提取验证码
Jun 08 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
PHP实现文件下载详解
Nov 27 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
php文件管理基本功能简单操作
Jan 16 PHP
php安全配置记录和常见错误梳理(总结)
Mar 28 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
php数组指针函数功能及用法示例
Feb 11 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
Javascript中的数学函数集合
2007/05/08 Javascript
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
20招让你的Python飞起来!
2016/09/27 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
python aiohttp的使用详解
2019/06/20 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
英国日常交易网站:Wowcher
2018/09/04 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
行政主管岗位职责
2013/11/18 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
暂住证明怎么写
2015/06/19 职场文书
元宵节晚会主持词
2015/07/01 职场文书
学习委员竞选稿
2015/11/20 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
app场景下uniapp的扫码记录
2022/07/23 Java/Android
box-shadow单边阴影的实现
2023/05/21 HTML / CSS