对象和短周期对象的获取方式"/>
Hyperf框架中单例对象和短周期对象的获取方式
Hyperf 单例对象获取与短周期对象获取
hyperf官方文档中关于短生命周期对象的描述:
短生命周期对象
通过 new 关键词创建的对象毫无疑问的短生命周期的,那么如果希望创建一个短生命周期的对象但又希望使用 构造函数依赖自动注入功能 呢?这时我们可以通过 make(string $name, array $parameters = []) 函数来创建 $name 对应的的实例,代码示例如下:
$userService = make(UserService::class, [‘enableCache’ => true]);Copy to clipboardErrorCopied
注意仅 $name 对应的对象为短生命周期对象,该对象的所有依赖都是通过 get() 方法获取的,即为长生命周期的对象,可理解为该对象是一个浅拷贝的对象
容器仅管理长生命周期的对象
换种方式理解就是容器内管理的对象都是单例,这样的设计对于长生命周期的应用来说会更加的高效,减少了大量无意义的对象创建和销毁,这样的设计也就意味着所有需要交由 DI 容器管理的对象均不能包含 状态 值。
状态 可直接理解为会随着请求而变化的值,事实上在 协程 编程中,这些状态值也是应该存放于 协程上下文 中的,即 Hyperf\Utils\Context。
所以,
Make()函数实例化的为短生命周期对象,起底层为new instance。
$container->get()从容器中获取单例模式的对象。
测试demo如下:
public function handle() {
$container = ApplicationContext::getContainer();
$obj = $container->get(TmallService::class);
var_dump('$obj',$obj->var);// string(4) "$obj" int(0)$obj->var = 6666;var_dump('$obj',$obj->var);// string(4) "$obj" int(6666)$object1 = make(TmallService::class);$obj2 = $container->get(TmallService::class);var_dump('$obj2',$obj2->var);die;// string(4) "$obj2" int(6666)$object1 = make(TmallServiceInterface::class,['enableCache' => true]);var_dump('$object1->var',$object1->var);// string(4) "$object1->var" int(0)$object1->var = 666;var_dump('$object1->var',$object1->var);// string(4) "$object1->var" int(666)$object2 = make(TmallServiceInterface::class,['enableCache' => true]);var_dump('$object2->var',$object2->var);// string(4) "$object2->var" int(0)$object2->var = 999999;var_dump('$object2->var',$object2->var); die;// string(4) "$object2->var" int(999999)// var_dump( ODeliveryOrder::query()->whereIn('id',[])->toSql() );die;// $res = make(OrderLogic::class)->updateDeliveryOrder([// 'o_delivery_order_id' => 1051485// ]);}
更多推荐
Hyperf框架中单例对象和短周期对象的获取方式
发布评论