Hyperf 的依赖注入通过 DI 容器实现,基于注解(@Inject)、配置和反射,在实例化类时自动解析并注入依赖;支持构造函数、属性和方法注入;服务注册优先级为注解>配置>手动 bind;@Inject 须配合命名空间与扫描,属性需 public/protected;容器支持 get、has、singleton 等操作。

Hyperf 的依赖注入(DI)基于其内置的 DI 容器 实现,核心是通过注解(如 @Inject)、配置和反射机制,在对象创建时自动解析并注入所需依赖,无需手动 new 或传参。
依赖注入怎么触发?
Hyperf 在实例化类(如 Controller、Service、Command)时,会检查构造函数参数类型或属性上的 @Inject 注解,然后从 DI 容器中查找对应类的实例或别名绑定,完成自动装配。
- 构造函数注入:最推荐方式,类型明确、不可变、易测试
- 属性注入:用
@Inject标记 public 属性,容器会在对象初始化后自动赋值 - 方法注入:较少用,需配合
@Inject和容器手动调用
如何注册服务到 DI 容器?
服务可通过多种方式注册进容器,优先级从高到低为:注解 > 配置 > 手动 bind。
- 自动扫描:默认开启,只要类有
@Inject或被其他注入类引用,就会被自动注册为单例 - 显式配置:在
config/autoload/dependencies.php中绑定接口与实现,例如:
`UserInterface::class => UserService::class` - 运行时绑定:在
Bootstrap或ServiceProvider中调用$container->bind()或->singleton()
@Inject 注解怎么写才有效?
@Inject 必须配合正确的命名空间和启用注解扫描。常见写法:
- 注入具体类:
@Inject private UserService $userService; - 注入接口实现(需已配置依赖映射):
@Inject private UserInterface $user; - 指定别名注入:
@Inject("custom_user_service") private UserService $service; - 注意:属性必须是
public或protected,private不支持(PHP 反射限制)
DI 容器常用操作有哪些?
除自动注入外,你还可以主动使用容器获取或管理实例:
- 获取实例:
$container->get(UserService::class) - 判断是否存在:
$container->has(UserService::class) - 设置共享实例(单例):
$container->singleton(...) - 设置每次新建实例:
$container->instance(...)或不设绑定,默认 prototype 模式 - 获取容器自身:
ApplicationContext::getContainer()









