方案: 每次请求结束时, 主动清洗掉已注册的单例
问题:
重新注册:
注册服务其实开销很大, 尤其是需要大量读文件的初始化(比如翻译组件)
无法区分进程共享的单例, 和请求隔离的单例....如果某个服务调用 在自己内未注册, 就会到父容器里查找. 父容器也是递归容器的话, 就会递归式查找.
这样, 进程级共享的单例, 就可以注册到 “进程级容器” ....而请求相互隔离的单例, 就注册到 “请求级容器”.
请求内都用 “请求级容器” 来获取实例, 这样就充分灵活了....“请求级” 容器用静态属性注册服务, 动态属性持有单例
伪代码如下:
trait ContainerTrait
{
/**
* 请求级容器持有的单例
* @var array...static $bindings = [];
这样, 所有服务只需要注册一次, 但服务的单例在每个请求内会重新生成一次.