实时自我更新的PHP类

Bas*_*saa 0 php class updates automatic-updates

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

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

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

这显然意味着PHP类需要对该类所在文件的写权限,因此它可以简单地用新版本覆盖该类.

类现在如何通过新的类版本执行所请求的API请求?在一个完美的世界中,我正在寻找一种不使用eval()的方法,因为此功能在许多主机上被阻止.

详细说明:

$myApi = new MyApi;
$myApi->registerCustomer($customerData);
Run Code Online (Sandbox Code Playgroud)

registerCustomer()函数会执行以下操作:

if (classNotUpToDate) {
    downloadNewClass();
    registerCustomerthroughNewClass()
} else {
    registerCustomerDo();
}
Run Code Online (Sandbox Code Playgroud)

现在我能想到的唯一方法就是:

  • 将新类版本下载到变量中
  • 在该变量中,替换class MyApi {...class MyApiUpdate {..
  • 再次包含当前文件,加载新的更新类
  • 创建新类的实例: $myApiUpdate = new MyApiUpdate;
  • 调用registerCustomer()函数:$myApiUpdate->registerCustomer($customerData);
  • 使用新的类代码覆盖当前文件内容(无替换)

这是实现我想要的唯一方法,无需创建新文件或使用eval()?我不认为这是一个非常漂亮的方法,所以我正在寻找一种更清洁的方法来实现这一目标.

Mik*_*son 6

我认为这种方法非常不安全,因此不推荐它.

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

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

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

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

但是,不,没有 "自动动态更新",也没有可写文件.正如他们所说:"不仅'不,'但是,' 地狱,不!'"