mts7/php-dependency-injection

PHP简单依赖注入容器

1.2.5 2024-05-29 20:04 UTC

This package is auto-updated.

Last update: 2024-09-18 18:51:24 UTC


README

PHP依赖注入容器

codecov

安装

composer require mts7/php-dependency-injection

使用

设置

获取实例化的对象只能在容器知道该类之后发生。向容器告知定义的一种方法是通过使用set方法。set方法可以将别名或完全限定的类名作为第一个参数,将完全限定的类名、实例化的对象或null作为第二个参数。

完整示例

$container = new Container();

// set an alias with a reference to the class name
$container->set('car', Car::class);
$car = $container->get('car');

// set the name to the class name and provide an instantiated object
$container->set(Car::class, new Car());
$car = $container->get(Car::class);

// provide only the name of the class and get an instantiated object
$container->set(Car::class);
$car = $container->get(Car::class);

加载

为了使项目更简单,可以通过load方法将抽象和具体值传递给容器。提供由抽象ID(键、类名等)索引的数组,值为具体实现。

load处理各种参数,使大多数实现能够即插即用。当键和值都存在时,可用的定义列表将添加有效值及其键。当配置数组没有键时,load使用值来确定键(应该是完全限定的类名)。每个值都会经过验证,以确定提供的具体实现是否为有效的类或对象。请参阅测试以获取示例。

load最好与提供预配置抽象及其具体实现自动加载的工厂一起使用。

完整示例

// the factory would create a new Container, then call ->load($config) with the appropriate values
$container = ContainerFactory::create();

$car = $container->get(Car::class);
$car->setName('Taco');
echo $car->getName();

获取

当一个类有自己的依赖关系时,所有依赖关系都可以在容器中设置后存在。容器通过反射来自动绑定来确定哪些参数是类,然后为每个参数实例化。

完整示例

$container = new Container();
$container->load([Color::class, Car::class]);

// there is no need to pass `Color` to the container since all dependencies load automatically
$car = $container->get(Car::class, ['Alice']);
// getting the color comes from Car's dependency rather than an outside influence
$car->getColor()->setHex('#F0F8FF');
echo $car->getName() . ' is ' . $car->getColor()->getHex();