【发布时间】:2016-08-09 13:59:23
【问题描述】:
我有一个 PHP 类,它可以与我们正在开发的 API 进行通信。我不想使用不同的 API 版本并让用户手动更新 PHP 类脚本,我想让这个过程自动化。
当发现更新时,此更新必须即时完成。这是我的想法:
- 用户的程序尝试通过我们提供的 PHP 类访问 API
- PHP 类检查更新
- 如果有更新,该类将下载新版本的类,并希望新版本的类处理 API 请求。
这显然意味着PHP类需要对该类所在文件的写权限,所以它可以简单地用新版本覆盖该类。
但是 old 类现在如何通过新的类版本执行请求的 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() 的情况下实现我想要的唯一方法吗?我不认为这是一个非常漂亮的方法,所以我正在寻找一种更清洁的方法来实现这一点。
【问题讨论】:
-
与其有一个自我更新的类,也许你可以有一个更新管理器来调解这个过程,因为一旦一个类被加载,你是否修改文件都没有关系,在下一个请求之前或除非您使用另一个框架,否则它无法重新加载。
-
重写一个核心程序结构(例如一个类)来促进协议更新过程是不好的。为什么?因为你可能会遇到数百万个问题。然而,既然你已经在这里了——你用过
composer吗? -
遗憾的是,我们仅限于 1 文件库。所以我们不能有多个文件,也不能使用 Composer 之类的任何库。
-
我们是在谈论 CLI 还是 web?
-
我们在谈论网络。
标签: php class updates automatic-updates