所谓容器, 相当于一个全局的工厂. 可以在这里 “注册” 各种服务的工厂方法, 再使用容器统一地获取....简单来说, 容器通过反射机制可获取目标方法的依赖 ( laravel 用反射来获取 typehint 类型约束, 而 Swoft项目似乎与spring 相似, 是从注释上获取的)....我个人看到过的解决策略有以下三种, 都能一定程度解决问题, 但也有美中不足之处.
克隆策略:
要递归地 clone 属性, 才能避免浅拷贝导致的污染
无法区分进程共享的单例, 和请求隔离的单例....中, 类似 laravel 的 serviceProvider 分两处注册.
// 在worker中注册的服务, 多个请求共享
'processProviders' => [
// 基础组件加载...CommuneChatbot 定义的 请求级容器, 在 __construct 和 __destruct 方法中做了简单的埋点, 伪代码如下:
class Container {
protected