DIC 是一个依赖注入容器,允许开发者将对象创建逻辑从其应用程序逻辑中移除。
V1.3.0
2019-06-08 05:06 UTC
Requires
- php: >=7.0.0
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: ~6.5
This package is auto-updated.
Last update: 2024-09-29 05:28:23 UTC
README
DIC 是一个简单的 依赖注入容器,用于 php,允许开发者将对象创建逻辑从其应用程序逻辑中移除。
此包与 PSR-1、PSR-4 和 PSR-11 兼容,如果您注意到合规性疏忽,请通过 pull request 发送补丁。
需求
此版本支持以下 PHP 版本
- PHP 7.0
- PHP 7.1
- PHP 7.2
测试
$ vendor/bin/phpunit
开始使用
通过 composer 安装此包
composer require oukhennicheabdelkrim/dic
简单用法
要创建容器,只需创建 DIC
类的一个实例。
<?php
include 'vendor/autoload.php';
use oukhennicheabdelkrim\DIC\DIC;
$container = new DIC();
绑定
您可以使用 bind
方法使用键绑定任何对象,然后您可以通过使用 get
方法通过引用它们的键来检索实例。
<?php
$container = new DIC();
//Bind myFoo to the Foo instance
$container->bind('myFoo',function(){
return new Foo();
});
$myFoo = $container->get('myFoo'); // Foo instance
注意: bind
方法返回当前容器。
get
方法默认创建一个单例实例,这意味着每次您请求一个依赖项时,它都返回相同的实例。
$container = new DIC();
$container->bind('myFoo',function(){
return new Foo();
});
var_dump( $container->get('myFoo') === $container->get('myFoo')); // true
在任何 resolve 可调用中,您始终可以访问 $container
属性,它提供了对当前容器的访问
$container = new DIC();
$container->bind('config.db',function(){
return new DbConfig();
});
$container->bind('dbConnection',function($container){
return new DbConnection($container->get('config.db'));
});
//Get a singleton DbConnection instance
$dbConnection=$container->get('dbConnection');
您还可以直接注入实例以绑定它
$container->bind('myFoo',new Foo());
获取新实例
您可以使用 getFactory
方法获取一个 新实例。
$container = new DIC();
$container->bind('myFoo',function(){
return new Foo();
});
$container->get('myFoo') === $container->getFactory('myFoo') // false
$container->getFactory('myFoo') === $container->getFactory('myFoo') // false
自动解析实例
DIC 可以使用 get
和 getFactory
方法中的真实类:名称作为参数自动解析任何可实例化的类,而无需 bind
方法。
示例 1
/* Foo class */
class Foo{
public $i;
public function __construct($i = 44){
$this->i=$i;
}
}
/* Bar class */
class Bar{
public $foo;
public function __construct(Foo $foo){
$this->foo=$foo;
}
}
$container = new DIC();
$bar=$container->get('Bar');
var_dump($bar->foo->i); // 44
// get method always returns a singleton instance.
var_dump($bar->foo === $container->get('Foo')); // true
//getFactory method always returns a new instance.
var_dump($bar->foo === $container->getFactory('Foo')); // false
示例 2
$container = new DIC();
$container->bind('bar1',function($container){
// resolve Foo using the class name
return new Bar($container->get('Foo'));
});
$bar1 = $container->get('bar1');// a singleton bar1 (Bar instance)
$bar = $container->get('Bar'); // a singleton Bar
var_dump($bar1 === $bar); // false
var_dump($bar1->foo === $bar->foo) ; // true
使用 DIC,您还可以绑定任何变量
$container = new DIC();
$container->bind('a',5);
var_dump($container->get('a')); // 5
$container->bind('db.config',function(){
$config = new Config(); // We can Also use $container->get('Config')
return $config->getArray('db'); // Array of database configuration
})->bind('dbConnexion',function($container){
return new DbConnexion($container->get('db.config'));
});
var_dump($container->get('db.config')); // Array of database configuration
var_dump($container->get('dbConnexion')); // singleton dbConnexion instance
注意:由于 bind
方法返回当前容器,因此您可以链式绑定过程。
示例
$myBar = $container->bind('myFoo',new Foo())
->bind('myBar',new Bar($container->get('myFoo'))
->get('myBar');
has 方法
has
方法如果容器可以为给定的标识符返回条目,则返回 true
,否则返回 false
。
/* A class */
class A{
}
$container = new DIC();
var_dump($container->has('A')) ;// true
var_dump($container->has('b')); // false
var_dump($container->bind('b',new A())->has('b'));// true