我想知道在一个 PHP 框架中实现两个 similair API 的好方法是什么?
我的想法是这样的:
- /vendors/wrapperA.php - 扩展父级,实现 API (A)
- /vendors/wrapperB.php - 扩展父级,实现 API (B)
- Parent.php -唯一直接引用以使用 API 包装器的脚本
- $config[] 数组用于 Parent.php 中的配置
- index.php - 一个实现且仅引用 Parent.php的网站
假设 API 有很多方法,但我们只实现了两个简单的 API 调用:
- connect() - 创建到服务的连接。
- put() - 如果成功返回一个“putID”。
由于 API (A)和 API (B)不同,这就是包装器通过抽象这两种方法来实现其实用程序的方式。
现在,我的观点是:
- 在 PHP 中实现这一点的好方法是什么?
- connect() 语句需要验证是否存在有效连接。
- put() 语句需要返回一个 ID
- 我们不想暴露 put 方法中的差异,它只需要根据我们是否正确配置 API 身份验证来工作(无论是什么情况 - 通过密钥或其他方式)
IE
就像是
<?php $parent = new Parent();
$parent->connect(); //connect to one or both API's.
$parent->put('foo'); //push foo to the API
?>
目前,我的所有代码都在 Parent.php 中。
在 Parent.php 中包含所有代码的问题
- 代码蔓延
- 如果我添加第三个 API,则缺少模块化插件。
- 代码混乱 - 哪个 API 是哪个?
编辑:根据 Marin 的回答设计的解决方案
<?php
/*** Interface ***/
interface API_Wrapper {
function connect();
function put($file);
}
/*** API Wrappers ***/
class API_A_Wrapper implements API_Wrapper {
function connect() {}
function put($file) { print 'putting to API A.'; }
}
class API_B_Wrapper implements API_Wrapper {
function connect() {}
function put($file) { print 'putting to API B.'; }
}
/*** Factory ***/
class Factory {
public static function create($type){
switch ($type) {
case "API_A" :
$obj = new API_A_Wrapper();
break;
case "API_B" :
$obj = new API_B_Wrapper();
break;
}
return $obj;
}
}
/*** Usage ***/
$wrapperA = Factory::create("API_A");
$wrapperA->put('foo');
$wrapperB = Factory::create("API_B");
$wrapperB->put('foo');