【hyperf 源码分析】容器 - (sunznx) 振翅飞翔
14 March 2020

config

hyperf 在初始化 application 即容器的时候,还会初始化 调用 /hyperf/di/src/Definition/DefinitionSourceFactory.php 这个类,这个类会继续调用 ProviderConfig::load() 。该方法会将项目下 extra.hyperf.config 合并起来。

extra.hyperf.config 的详细内容可以看 https://hyperf.wiki/#/zh-cn/component-guide/configprovider

容器里面有什么东西

hyperf 容器存的是 definitiondefinition 分几种

  • SelfResolvingDefinitionInterface(调用 resolve 方法)
  • ObjectDefinition (相当于 new 一个 object,但是不是简单的 new,而是通过反射,因为需要解析构造函数的早熟)
    举例:
    由于 ServerFactory 这个 class 是存在的,所以 $container->get(ServerFactory::class) 直接是 new ServerFactory
  • FactoryDefinition (调用 __invoke 方法)
    举例:
    /hyperf/framework/src/ConfigProvider.php 的 dependencies 指定了 ApplicationInterface::class => ApplicationFactory::class ,所以 $container->get(ApplicationInterface::class) 就会找到 ApplicationFactory 的 __invoke 方法

在使用 容器 来实例化类的时候,hyperf 除了自动解析 __construct 之外,还会将带有 @Inject 注解的属性,自动填充对应的属性