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

首先我们先引用些概念:
工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有其同的父类。工厂模式属于类的创建模式,通常根据自变量的不同返回不同类的实例。
工厂模式的实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品的实例。工厂模式式涉及到工厂角色、抽象产品角色和具体产品角色。
工厂(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_Db::Factory()到底是实现根据不同的参数选择不同的数据库的。

(0)

相关推荐

  • Zend Framework入门教程之Zend_Config组件用法详解

    本文实例讲述了Zend Framework中Zend_Config组件用法.分享给大家供大家参考,具体如下: 1.从PHP数组中读取数据 使用Zend_Config_Ini(读取ini配置文件) Zend_Config_Xml(读取XML配置文件) 案例: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass('Zend_Config'); $array = array( 'webhost' => '12

  • Zend Framework入门教程之Zend_Registry组件用法详解

    本文实例讲述了Zend Framework中Zend_Registry组件用法.分享给大家供大家参考,具体如下: 1.对象注册表 入门案例: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass('Zend_Registry'); $member = array( "姓名"=>"张三", "性别"=>"女", "

  • Zend Framework入门教程之Zend_Mail用法示例

    本文实例讲述了Zend Framework入门教程之Zend_Mail用法.分享给大家供大家参考,具体如下: Zend_Mail组件提供了通用化的功能来创建和发送文本. Zend_Mail通过PHP内建的mail()函数或者直接通过SMTP连接来发送邮件. 一个简单的邮件由收件人.主题.邮件内容以及发件人等内容组成. 步骤如下 1.创建对象 2.设置邮件内容 3.发送 案例: <?php require_once "Zend/Mail.php"; $my_mail = new Z

  • Zend Framework 2.0事件管理器(The EventManager)入门教程

    概述 EventManger是一个为以下使用情况设计的组件: 复制代码 代码如下: 实现简单的主题/观察者模式 实现面向切面的设计 实现事件驱动的架构 基本的架构允许你添加和解除指定事件的侦听器,无论是在一个实例基础还是一个共享的集合:触发事件:终止侦听器的执行. 快速入门 通常,你将会在一个类中创建一个EventManager. 复制代码 代码如下: use Zend\EventManager\EventManagerInterface; use Zend\EventManager\Event

  • Zend Framework入门教程之Zend_Db数据库操作详解

    本文实例讲述了Zend Framework中Zend_Db数据库操作方法.分享给大家供大家参考,具体如下: 引言:Zend操作数据库通过Zend_Db_Adapter 它可以连接多种数据库,可以是DB2数据库.MySQli数据库.Oracle数据库.等等. 只需要配置相应的参数就可以了. 下面通过案例来展示一下其连接数据库的过程. 连接mysql数据库 代码: <?php require_once 'Zend/Db.php'; $params = array('host'=>'127.0.0.

  • Zend Framework入门教程之Zend_Session会话操作详解

    本文实例讲述了Zend Framework入门教程之Zend_Session会话操作.分享给大家供大家参考,具体如下: 会话命名空间 实现会话 代码: <?php require_once "Zend/Session/Namespace.php"; $myNamespace = new Zend_Session_Namespace('Myspace'); if(isset($myNamespace->numberOfPageRequests)) { $myNamespace

  • Zend Framework入门教程之Zend_View组件用法示例

    本文实例讲述了Zend Framework入门教程之Zend_View组件用法.分享给大家供大家参考,具体如下: Zend_View组件可以实现MVC模式中视图部分的代码与Model和Controller部分的分离. 使用步骤:首先在Controller中建立一个Zend_View实例,并将需要的变量传递给它:之后,Controller通知Zend_View显示一个特定的视图, 生成View输出的内容. 实例之控制器代码脚本: <?php //使用模型来获取书籍作者和标题相关数据 $data =

  • Zend Framework开发入门经典教程

    本文讲述了Zend Framework开发入门相关知识点.分享给大家供大家参考,具体如下: Zend Framework发布了!虽然仍处于开发初期,这个教程仍突出讲解目前几个最好的功能,并指导你完成一个简单程序的构建. Zend最早在社区里发布了ZF.基于同样的想法,这个教程写来用于展示ZF现有的功能.由于这个教程是在线发布,我将在ZF变化时对其进行更新,以便尽可能有效. 要求 Zend Framework要求PHP5.为了更好利用本教程的代码,你还需要Apache网页服务器.因为示范程序(一个

  • Zend Framework入门应用实例详解

    本文实例讲述了Zend Framework入门应用.分享给大家供大家参考,具体如下: .htaccess文件 .htaccess文件用来实现URL重置,即当用户访问某资源时,会将其重新定位到指定的文件下. 代码示例: RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php 其中,行1表示重置引擎打开,行2表示当访问除js.ico.gif.jpg.png.css以外的文件时, 都将被重置到index.php文件下. 注

  • Zend Framework入门知识点小结

    本文总结分析了Zend Framework入门知识点.分享给大家供大家参考,具体如下: zend framework是MVC模式的一种实现,要快速的入门差不多只看Zend_Controller Zend_View 部分就可以了吧. 1.Zend_Controller部分.最重要的类是Zend_Controller_Front.使用它的经典代码很 简单: $front=Zend_Controller_Front::getInstance(); $front-> setControllerDirec

  • Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)

    本文实例讲述了Zend Framework入门之环境配置及第一个Hello World程序.分享给大家供大家参考,具体如下: 第一步:确认你的PHP环境: 1.请PHPer确认你的PHP版本是否在5.2.0以上..如果不是的话..请更新到5.2.0,否则.Zend Framework 好像用不了..我自己有试过. 遇到过这样的问题..所以请你们自己测试一下..PHP源码最新版下载地址为:http://www.php.net/downloads.php. 2.你的PHP环境配置好了之后,请打开ph

随机推荐