适配器是什么?
适配器(Adapter)模式为对象提供了一种完全不同的接口。你可以运用适配器(Adapter)来实现一个不同的类的常见接口,同时避免了因升级和拆解客户代码所引起的纠纷。举个例子:PHP连接数据库,数据库可能为MYSQL也可能为SQL SERVER 还可能为SQLLITE,ORCALE等等,怎样写一个通用的调用接口来连这些数据库以应对如果我们要更换不同的数据库的话,我们不需要大篇幅更改程序,可能我们只要改一行就OK了.
因为是用ZendFramework做MVC开发,所以就做一个扩展就好了.
1.建一个Custom的目录,目录结构如下
Custom 一级目录
—Provider 二级目录
—–Adapter 三级目录
——–Abstract.php
——–Example1.php
——–Example2.php
——–Example3.php
—–Exception.php
—–Provider.php
2.首先介绍Provider.php这个文件为接口的入口
下载: Provider.php
复制PHP内容到剪贴板
这个文件通过调用factory方法,得到真正要使用的类并实例化,把对象返回PHP代码:
<?php
/**
* @see Zend_Loader
*/
require_once 'Zend/Loader.php';
class Custom_Provider
{
public static function factory($providername)
{
//设定适配器默认路径
$adapterNamespace = 'Custom_Provider_Adapter';
//根据参数得到准备路径
$adapterName = strtolower($adapterNamespace . '_' . $providername);
//ucwords 将单词首字母转换大写
$adapterName = str_replace(' ', '_', ucwords(str_replace('_', ' ', $adapterName)));
//加载文件
Zend_Loader::loadClass($adapterName);
//新建实例
$piAdapter = new $adapterName();
//安全验证
if (! $piAdapter instanceof Custom_Provider_Adapter_Abstract) {
require_once 'Custom/Provider/Exception.php';
throw new Custom_Provider_Exception("Adapter class '$adapterName' does not extend Custom_Provider_Adapter_Abstract");
}
return $piAdapter;
}
}
3.接下来是Exception.php这是一个异常类,只需要继承Zend_Exception就可以了
下载: Exception.php
复制PHP内容到剪贴板
4.接下来是Abstract.php这是一个抽象类,为各个Example抽象公用的方法名,如果各个example为不同实现过程的就可以定为抽象类,在子类实现声明PHP代码:
<?php/**
* Custom_Provider_Exception
*/
require_once 'Zend/Exception.php';class Custom_Provider_Exception extends Zend_Exception
{
}
下载: Abstract.php
复制PHP内容到剪贴板
5.接下来是Example1.php这是一个私有类,每个Example有不同的处理过程,但有相同的方法名,同时都继承自Abstract.php类PHP代码:
<?php
/**
* @see Zend_Loader
*/
require_once 'Zend/Loader.php';
abstract class Custom_Provider_Adapter_Abstract
{
function __construct()
{
}
function abc()
{
echo "abc";
}
abstract function httpPost();
abstract function getResult();
}
下载: Example1.php
复制PHP内容到剪贴板
另外两个Example文件和这个差不多,就不写出来了.PHP代码:
<?php
/**
* @see Zend_Loader
*/
require_once 'Zend/Loader.php';
class Custom_Provider_Adapter_Example1 extends Custom_Provider_Adapter_Abstract
{
function httpPost()
{
echo "example1 post";
}
function getResult()
{
echo "example1 Result";
}
}
6.最后给一个调用的例子
下载: IndexController.php
复制PHP内容到剪贴板
PHP代码:
<?php
class IndexController extends Zend_Controller_Action
{
function indexAction()
{
$pi = Custom_Provider::factory('example1');
$pi->abc();
echo "<br>";
$pi->httpPost();
echo "<br>";
$pi->getResult();
}
}
到这里一个简单的适配器最完成了.这样可以减少代码的冗余,建立统一入口.对代码的升级等也很有好处.
可到http://www.php126.com/?p=472 下载
免费内容:
PHP易网-接建站外包.zendframework框架开发

