Mohamed-Amine / ioc-container

控制反转容器

v0.8.3 2024-06-06 23:41 UTC

README

Build Status

如何安装

通过composer

composer require mohamed-amine/ioc-container

它能做什么

  • 自动创建实例并解析它们的依赖项。
  • 如果已注册,则可以从类型(如接口)解析依赖项。
  • 从已注册的服务定位器创建实例。
  • 将现有实例绑定到容器中(可用于服务提供者)。
  • 在任何地方调用容器中的实例。

如何使用它

创建容器

为了使用所有功能,我们首先需要创建一个容器

  IOC\IOC::createContainer();

在容器中创建实例

  • 为了创建一个实例并自动解析其依赖项
  IOC\IOC::container()->build('namespace\MyClass');

这将创建MyClass对象,并为它创建所有递归依赖项,例如

// instead of doing this
new MyClass(new ClassA(), new ClassB());
// you can just do this and it will create ClassA & ClassB and pass them automatically
IOC\IOC::container()->build('namespace\MyClass');

为了使这起作用,您需要在MyClass构造函数中使用类型提示

...
public function __constructor(ClassA $classa, ClassB $classb) {...}
...
  • 如果实例需要参数,我们应该将它们作为数组传递给'build()'的第二个参数(注意,在此情况下不能使用自动依赖项解析)
  IOC\IOC::container()->build('namespace\MyClass', $argument1, $argument2);

将实例绑定到容器中

要将现有实例绑定到容器中

  IOC\IOC::bind('MyClass',function() {
    return new namespace\MyClass();
  });

现在我们可以在应用程序的任何地方访问我们的实例,如下所示

  IOC\IOC::container()->MyClass;
  // or 
  IOC\IOC::container()->get('MyClass');

从服务定位器(简称)构建实例

我们可以使用register方法定义服务定位器

  IOC\IOC::container()->register('MyClass', namespace\MyClass::class);

然后我们可以使用此服务定位器构建一个实例

  IOC\IOC::container()->build('MyClass');

注册类型

注册类型以帮助容器解析类依赖项,例如,如果类A依赖于Type SomeInterface,这是一个接口,我们将首先注册此类型,以便能够解析它

  IOC\IOC::container()->registerType('SomeInterface', Namespace\SomeClass::class);

从容器调用实例

我们可以使用两种方法从容器调用实例

  IOC\IOC::container()->MyInstance;
  // Or
  IOC\IOC::container()->get('MyInstance');