yetanother / di
另一个PHP依赖注入容器
dev-master
2013-07-29 16:32 UTC
Requires
- php: >=5.3.0
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) { ... });