kanian/containerx

简单的PHP DI容器

1.5.1 2019-03-20 14:55 UTC

This package is auto-updated.

Last update: 2024-09-21 21:14:32 UTC


README

ContainerX是一个小巧的PHP依赖注入容器。

安装

$ composer require kanian/containerx

用法

Car 类是

class Car {
	protected $driver;
    public function __construct(Driver $driver)
    {
    	$this -> driver = $driver;
    }
    \\\ ... more car code
}

HumanDriver 类是

class HumanDriver implements Driver {
  public function drive()
  {
  	\\\ ... some driving code
  }
}

我们可以使用

容器功能作为对象方法

为了以对象方法的方式访问容器功能

use Kanian\ContainerX\Container;

$container = new Container();
$container->set('chauffeur', function($c){ return new HumanDriver;});
$container->set('limo', function($c){ return new Car($c->get('chauffeur'));});

$limo = $container->get('limo');

我们已经使用匿名函数作为工厂。此外,我们可以简单地注册所需的依赖,并让容器实例化它们

use Kanian\ContainerX\Container;
$container = new Container();
$container->set('chauffeur',HumanDriver::class);
$container->set('limo',Car::class);
$limo = $container->get('limo');

容器将知道如何为我们构建一个Car实例。

或者,我们可以使用

通过ArrayAccess接口使用容器功能

例如,我们可以通过使用实现了ArrayAccess接口的 Kanian\Container\ContainerX 类来实现基于工厂的注册。

use Kanian\ContainerX\ContainerX;

$container = new ContainerX();
$container['chauffeur'] =  HumanDriver::class;
$container['limo'] = Car::class;

$limo = $container['limo'];

将依赖项作为单例访问

为了确保系统在任何时候都只有一个依赖项的副本,您将使用

singletonize

方法,如下所示

$container->singletonize('limo', Car::class);
$limo = $container['limo'];

现在您将始终得到同一个Car实例,但HumanDriver的实例却是不同的。