我有一个PHP类,可以与我们正在开发的API进行通信。我不想使用不同的API版本并让用户手动更新PHP类脚本,而是希望自动完成此过程。
此更新必须在找到更新后即时完成。这是我的想法:
这显然意味着PHP类需要对该类所在文件的写权限,因此它可以简单地用新版本覆盖该类。
但旧类现在如何通过新的类版本执行所请求的API请求?在一个完美的世界中,我正在寻找一种不使用eval()的方法,因为这个功能在许多主机上被阻止。
详细说明:
$myApi = new MyApi;
$myApi->registerCustomer($customerData);
registerCustomer()函数会执行以下操作:
if (classNotUpToDate) {
downloadNewClass();
registerCustomerthroughNewClass()
} else {
registerCustomerDo();
}
现在我能想到的唯一方法就是这样做:
class MyApi {...
替换为class MyApiUpdate {..
$myApiUpdate = new MyApiUpdate;
registerCustomer()
函数:$myApiUpdate->registerCustomer($customerData);
这是实现我想要的唯一方法,无需创建新文件或使用eval()吗?我不认为这是一个非常漂亮的方法,所以我正在寻找一种更清洁的方法来实现这一目标。
答案 0 :(得分:6)
我认为这种方法相当深度不安全,因此不推荐它。
相反,我建议您的API应该要求在每次请求时发送“API版本”指示符:客户端通知服务器它使用的API版本,服务器以类似的方式通知客户端响应的版本它。
使版本尽可能“向上兼容”。较新版本的API可以与旧版本通信,并且由于双方自我识别,您确切地知道每个人可以和不可以使用哪些请求。如果您发明了一个取代旧版本的新API调用,请在实现中保留两者,即使您“删除”其中一个或者让旧调用的实现调用代码较新的一个。
如果必要且适当,可以使用子类实现不同版本的API。
当然,您应该为每个API版本提供测试套件,并且您应该验证所有旧版测试是否继续针对较新版本正确运行。也就是说,没有“回归”。
但是,不,没有“自动动态更新”和没有可写文件。正如他们所说:“不仅'不','但是,'地狱,不!'”