另一个PHP依赖注入容器

dev-master 2013-07-29 16:32 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:43:59 UTC


README

YetAnother DI — 一个灵活的DI容器,根据类构造函数的参数创建类实例及其依赖。您不再需要配置文件、依赖描述、服务命名或匿名函数 — 容器将从一个类的构造函数中获取所有关系信息。与流行的DI容器不同,该容器只与单例(即仅创建一次的对象)一起工作。

安装

推荐通过 composer 安装

{
    "require": {
        "yetanother/di": "dev-master"
    }
}

创建容器

use YetAnother\DI\Container;

$container = new Container();

创建对象

$myObject = $container->get('MyClass');
// или
$myObject = $container['MyClass'];

获取对象

在创建对象时,容器会自动保存它。获取已创建的对象使用相同的函数执行

$myObject = $container->get('MyClass');
// или
$myObject = $container['MyClass'];

检查存在性

$container->has('MyClass'); // true/false
// или
isset($container['MyClass']);

手动添加对象

$myObject = new MyClass();
$container->push($myObject);
// или
$container[] = $myObject;

// после добавления можно получить доступ к объекту по имени класса:
$container->get('MyClass') === $myObject; // true

从容器中删除对象

$container->remove('MyClass');
// или
unset($container['MyClass']);

创建具有依赖关系的对象

假设类MyModel依赖于类Database,并且这种依赖关系在构造函数中描述

class MyModel
{
    private $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
        echo 'MyModel created';
    }
}
class Database()
{
    public function __construct()
    {
        echo 'Database created';
    }
}

那么,在创建类MyModel的对象时,首先会创建类Database的对象

$myModel = $container->get('MyModel');
// Database created
// MyModel created

但是,如果类Database的对象已经创建并存储在容器中,那么它将被传递到类MyModel的构造函数中,即不会再次创建

$db = $container->get('Database');
// Database created
$myModel = $container->get('MyModel');
// MyModel created

因此,将按链式创建所有依赖。

在创建对象时添加功能

如果需要在创建对象时执行额外的操作,可以在匿名函数中描述它们

$container->set('Database', function () {
    $db = new Database();
    $db->connect();
    return $db;
});
// или
$container['Database'] = function () {...};

为了在匿名函数中使用对象,请将它们作为参数传递给函数

$container->set('UserModel', function (Database $db, Session $session) {
    ...
});

容器依赖

除了任何对象外,您还可以将容器本身用作依赖,但这不推荐,因为这样做会难以追踪类之间的关联,并且会复杂化测试过程。

class MyClass
{
    public function __construct(Container $container)
    {
        ...
    }
}
$container->set('MyClass', function (Container $container) {
    ...
});