PHP-DI 从5.4.6升级到6.4:原型作用域对象定义方法问询
PHP-DI 6.x 里已经用 DI\autowire() 替代了旧版的 DI\object(),而且所有定义默认都是单例作用域,要实现每次注入/获取都生成新实例,直接在定义文件里显式指定作用域即可,不用大面积改代码用 make()。
两种可行的配置方式:
- 方法一:用 autowire 配置作用域
这是最简洁的写法,直接通过autowire配合scope方法指定原型作用域(注意Scope::PROTOTYPE是常量,不用加括号):
use DI\Scope; return [ setasign\Fpdi\Fpdi::class => DI\autowire()->scope(Scope::PROTOTYPE), ];
- 方法二:给 factory 显式设置作用域
你之前用factory时每次拿到同一个实例,是因为默认单例作用域,给工厂定义加上scope(Scope::PROTOTYPE)就能解决:
use DI\Scope; return [ setasign\Fpdi\Fpdi::class => DI\factory(function () { return new setasign\Fpdi\Fpdi(); })->scope(Scope::PROTOTYPE), ];
配置完成后,不管是用 $container->get() 获取,还是依赖注入到其他类中,每次都会生成新的 Fpdi 实例。
内容的提问来源于stack exchange,提问作者user3008460
相关产品推荐
相关产品推荐

