king23 / di

king23 依赖注入器

2.0.2 2022-10-27 14:33 UTC

This package is auto-updated.

Last update: 2024-08-27 18:14:28 UTC


README

License Latest Stable Version Total Downloads Scrutinizer Code Quality Code Coverage SensioLabsInsight

King23/DI,King23的依赖注入库

版权所有(C) 2015 - 2018 归Peter Petermann所有。

许可证

King23/DI采用MIT风格许可证,有关更多信息请参阅LICENSE.md

需求

  • PHP 5.6(可能在更早的版本上运行,未经测试)
  • LINUX / MAC OS X(可能在Windows上运行,未经测试)

使用方法

READTHIS

此DI容器实现了Psr-11,可以按照Psr-11的描述使用,但有两点需要注意:

  • Psr-11声明调用者不应假设字符串的结构具有语义意义。然而,当使用King23\DI时,建议使用描述服务的接口来注册和检索服务,这通常是一个好的做法,因为它可以避免命名混淆,特别是对于这个容器来说,这是一个非常好的主意,因为它允许通过类型提示进行自动绑定,以处理正确的服务注入,因此您不需要为想要使用的每个类创建描述。
  • Psr-11的has方法应该返回DI容器中是否已注册了id,对于自动绑定的方式以及使用接口(见上文),这里的行为略有不同 - King23\DI还将检查传递的id是否是一个现有的类,然后将其加载,因此如果标识符存在,它将返回true,如果不存在,它将检查是否可以自动实例化传递的类/接口名称,假设这就是标识符。

安装

使用composer安装

提示:King23/DI遵循语义版本2.0.0,因此您可以在composer中将版本设置为类似“~1.0”的东西

使用方法

基本上,容器提供了4个方法

提示:King23\DI使用$classname作为参数名称,但这与Psr-11的$id等效

  • void register(string $interface, callable $implementation)
  • void registerFactory(string $interface, callable $implementation)
  • mixed get(string $classname)
  • bool has(string $classname)

register($interface, $implementation)用于注册注入依赖,其中$interface在理论上是任何字符串,但它的目的是持有接口的名称。可调用项应该是一个返回接口新实例的方法(实际上并没有内置机制来阻止您使用任意字符串,但在使用getInstanceOf时,构造函数的自动注入正在使用参数的类型提示。如果您使用任何其他字符串,则无法自动注入 - 这在一定程度上抵消了其作用。话虽如此,它仍然可以在将King23/DI与需要特定键的框架集成时派上用场)。这里返回的对象只会实例化一次,后续调用将返回相同的实例。

registerFactory($interface, $implementation)与register()的作用方式相同,只是每次请求$interface的实例时,都会创建一个新的实例。

get($classname),将返回一个类型为 $classname 的对象,该对象获取了其构造函数类型提示中使用的接口定义的依赖注入。如果使用作为 register/registerFactory 键的类/接口名称调用,它实际上将返回已注册服务的实例。(psr-11)

has($classname),将返回一个布尔值,检查类/ID 是否实际可用(psr-11)

示例

    <?php
    // get an Instance of the container
    $container = \King23\DI\DependencyContainer();
   
    // register a singleton service
    $container->register(\ExampleInterface::class, function() {
        return new \ExampleImplementation();   
    });
   
    // now that there is a service registered for \ExampleInterface, we can actually use it
    var_dump($container->get(\ExampleInterface::class)); // will dump an instance of \ExampleImplementation
   
    /** 
     * A simple class with a constructor that allows to inject an instance of \ExampleInterface
     */
    class Foobar 
    {
        protected $example;

        public function __construct(\ExampleInterface $example)
        {
            $this->example = $example;
        }
        
        public function dumpExample()
        {
            var_dump($this->example);
        }
    }
    
    $object = $container->get(Foobar::class); // this line would cause $object to be an instance of Foobar
                                                      // having a protected member $example, that holds a reference
                                                      // to the \ExampleImplementation
   
    $object->dumpExample(); // will dump an instance of \ExampleImplementation
   

链接

联系信息