此包已被废弃且不再维护。作者建议使用monolyth/公开包代替。

PHP5 依赖注入框架

2.0.2 2016-01-30 11:41 UTC

This package is auto-updated.

Last update: 2022-02-01 12:43:48 UTC


README

PHP5 依赖注入和服务定位器框架。大多数现有的 DI 或控制反转 (IoC) 解决方案都依赖于大量的配置文件来定义依赖。这很糟糕;Disclosu

截至版本 2.0,Disclosure 完全兼容(即将发布的)PSR 容器对象建议。包中包含尚未发布的 PSR\Container 接口副本(直到它们最终发布...)。

安装

Composer(推荐)

composer require monomelodies/disclosure

手动安装

  1. 获取或克隆代码;
  2. 在您的 PSR-4 自动加载器中将 /path/to/disclosure/src 注册为 Disclosure\\ 命名空间;
  3. 在您的 PSR-4 自动加载器中将 /path/to/disclosure/psr 注册为 Psr\\Container\\ 命名空间;

使用方法

将您的依赖项添加到某个位置的 Container 对象中。通常在中心文件(例如 src/dependencies.php)中这样做是有意义的,但与类定义一起执行也完全没问题。

<?php

use Disclosre\Container;

$container = new Container;
$container->register(function (&$foo, &$bar) {
    $foo = new Foo;
    $bar = new Bar;
});

容器现在会将 foo 键与实例为 Foo 的对象相关联。键的命名无关紧要;只需记住它们必须是唯一的。

使用由 Injector 特性提供的 inject 方法告诉您的类它们应该依赖什么

<?php

use Disclosure\Injector;

class MyClass
{
    use Injector;

    public function __construct()
    {
        $this->inject(function ($foo, $bar) {});
        // Or, alternatively:
        $this->inject('foo', 'bar');
    }
}

class Foo
{
}

$myInstance = new MyClass;
var_dump($myInstance->foo instanceof Foo); // true

inject 接受任意数量的参数,其中每个参数都是一个包含依赖名称的字符串,或一个包含依赖名称作为参数的可调用对象。您使用哪种样式取决于您的个人喜好。

哇! 为什么不直接这样做 $this->foo = new MyDependency;

有许多理由使用容器而不是到处使用 new 关键字,但主要理由是

  • 硬编码实例使在单元测试期间注入模拟变得困难(您可以使用 class_alias 来做这件事,但说真的)。
  • 它会导致类之间的紧密耦合,这是一个坏主意(tm)。
  • 它使将对象作为服务定位器注入(即,一个对象的单个实例而不是每次都创建一个新的实例)变得更容易。

不,在上面的例子中,它并没有添加多少,但请参阅完整的文档,了解依赖注入在现实世界中的实际示例,为什么通常是一个好主意。