king23 / di
king23 依赖注入器
Requires
- php: >=8
- psr/container: ~1.0
Requires (Dev)
- phpunit/phpunit: ~8
Provides
- psr/container-implementation: 1.0.0
README
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安装
- https://getcomposer.org.cn
- 在您的项目中:
php composer.phar require king23/di
提示: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
链接
联系信息
- Peter Petermann [email protected]