NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[TOC] ### 作用域 我们在容器中注册的对象可能会有多种作用域,不同作用域表示的对象的生命周期不同 #### 1.默认作用域 默认注册到容器内的对象都是单例,对象在整个容器内只会有一个 >[info]注意下 swoole 不同worker进程内对象会不同,这里很有可能会一个worker进程里一个对象,但是你可以理解为就一个,问题不大的 #### 2.WorkerScope woker 如果一个类 实现了 WorkerScope接口 ,那么它的作用域就是整个 worker 进程,和上面的单例的生命周期基本相同 不同的是默认单例创建后不可以重新创建新的,但是WorkerScope的实例是可以的 调用下面方法后 ,所有WorkerScope作用域的对象会在下次使用时创建新的对象 ~~~ worker_scope_change() ~~~ #### 3.RequestScope 如果一个类 实现了 RequestScope接口 ,那么它的作用域就是当前请求(协程) 相同的请求(协程)注入的对象是相同的,不同的请求(协程)注入对象是不同的; #### 3.SessionScope 如果一个类 实现了 SessionScope接口 ,那么它的作用域就是整个 session 同一个session下是相同的,不同的 session 是不同的,对象需要支持序列化和反序列化; #### 5.PrototypeScope 每次注入都会产生一个新的对象 ### 使用注意 #### 1.ScopeProperty WorkerScope,RequestScope,SessionScope除了实现接口外,在注入时也是需要注意的; 对应的类必须 use ScopeProperty 的trait 同时对应属性不能直接在类中定义,只能在类文件注释中通过 @property 注解对应属性;不然会变成默认的单例了; 具体代码如下: ~~~ /** * 微信小程序接口 * * @property WeixinMiniService $weixinMiniService * @author: 藤之内 */ class MiniAppController { use ScopeProperty; //这里不对定义 $weixinMiniService 属性 /** * MinniAppController __construct. * * @param $weixinMiniService */ public function __construct(WeixinMiniService $weixinMiniService) { $this->weixinMiniService = $weixinMiniService; } } ~~~ #### 2. PrototypeScope PrototypeScope如何也使用了ScopeProperty 那么相对于同一个类,每次请求都是不一样的对象,不同的的类中也是不一样的 如果在类属性中定义了对应的对象,相对于同一个类是同一个对象,相对于不同的类是不同的对象; #### 3. spl_object_hash 关于对象是否是同一个 大家可以使用php 的spl_object_hash函数进行验证,每个对象该函数会产生对应的 hash 值