DIC 是一个依赖注入容器,允许开发者将对象创建逻辑从其应用程序逻辑中移除。

V1.3.0 2019-06-08 05:06 UTC

This package is auto-updated.

Last update: 2024-09-29 05:28:23 UTC


README

DIC 是一个简单的 依赖注入容器,用于 php,允许开发者将对象创建逻辑从其应用程序逻辑中移除。

Build Status Latest Stable Version License

此包与 PSR-1PSR-4PSR-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 可以使用 getgetFactory 方法中的真实类:名称作为参数自动解析任何可实例化的类,而无需 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