实时自我更新的PHP类

时间:2016-08-09 13:59:23

标签: php class updates automatic-updates

我有一个PHP类,可以与我们正在开发的API进行通信。我不想使用不同的API版本并让用户手动更新PHP类脚本,而是希望自动完成此过程。

此更新必须在找到更新后即时完成。这是我的想法:

  • 用户程序尝试通过我们提供的PHP类访问API
  • PHP类检查更新
  • 如果有更新,该类将下载该类的新版本,并希望该类的新版本处理API请求。

这显然意味着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()吗?我不认为这是一个非常漂亮的方法,所以我正在寻找一种更清洁的方法来实现这一目标。

1 个答案:

答案 0 :(得分:6)

我认为这种方法相当深度不安全,因此不推荐它。

相反,我建议您的API应该要求在每次请求时发送“API版本”指示符:客户端通知服务器它使用的API版本,服务器以类似的方式通知客户端响应的版本它。

使版本尽可能“向上兼容”。较新版本的API可以与旧版本通信,并且由于双方自我识别,您确切地知道每个人可以和不可以使用哪些请求。如果您发明了一个取代旧版本的新API调用,请在实现中保留两者,即使您“删除”其中一个或者让旧调用的实现调用代码较新的一个。

如果必要且适当,可以使用子类实现不同版本的API。

当然,您应该为每个API版本提供测试套件,并且您应该验证所有旧版测试是否继续针对较新版本正确运行。也就是说,没有“回归”。

但是,不,没有“自动动态更新”和没有可写文件。正如他们所说:“不仅'不','但是,'地狱,不!'”