mts7 / php-dependency-injection
PHP简单依赖注入容器
1.2.5
2024-05-29 20:04 UTC
Requires
- php: ^8.1
Requires (Dev)
- mts7/php-code-quality: ^0.1.19
- phpunit/phpunit: ^10.5
- roave/security-advisories: dev-latest
Provides
- psr/container: 1.0.0
README
PHP依赖注入容器
安装
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();