我不明白这个“DI 容器”是如何使用的。官方网站上显示的示例什么也没告诉我:http: //pimple.sensiolabs.org
基本上我有一个简单的站点,它由一组类组成:DB 类、Cache 类、User 类和其他一些处理内容类型的类。
所有这些类就像 Pimple 中提到的“服务”,每个服务都应该能够调用另一个服务。现在我在一个主类中实例化服务,我像单例一样使用它来在其他类之间共享服务。
从我读到的内容来看,Pimple 正是这样做的,但我该如何使用它呢?:秒
我不明白这个“DI 容器”是如何使用的。官方网站上显示的示例什么也没告诉我:http: //pimple.sensiolabs.org
基本上我有一个简单的站点,它由一组类组成:DB 类、Cache 类、User 类和其他一些处理内容类型的类。
所有这些类就像 Pimple 中提到的“服务”,每个服务都应该能够调用另一个服务。现在我在一个主类中实例化服务,我像单例一样使用它来在其他类之间共享服务。
从我读到的内容来看,Pimple 正是这样做的,但我该如何使用它呢?:秒
在http://phpmaster.com/dependency-injection-with-pimple/有一个教程,解释了如何将 Pimple 用作 DIC。
另一种(但不一定推荐)方法是将容器注入到所有需要它的组件中(例如,您像 ServiceLocator 一样使用它),然后您只需按照文档中的说明从 Pimple 获取对象:
class SomeClassThatNeedsSession
{
private $session;
public function __construct(Pimple $container)
{
$this->session = $container['session'];
}
}
换句话说,您只需获取您需要的内容,Pimple 将处理该对象的生命周期,例如它是否需要被创建或被重用。OffsetGet 是ArrayAccess
接口的一部分,它允许您访问像数组一样的对象,因此当您这样做时,$container['foo']
Pimple 将检查它是否为 foo 定义了一个闭包,以确定它是否只是一些参数并相应地组装服务。
Pimple 是一篇关于 Lambdas 和 Closures 的博客文章的结果,您可能想阅读它以更好地了解它是如何工作的。
我不知道 Pimple,但我知道的 DI 引擎可以让你摆脱实例化。您的对象不会创建其依赖项的实例。相反,DI 引擎会根据要求创建它们并分发它们。
因此,如果您的 PHP 代码正在创建新实例,我认为您应该更改它,以便您的代码获取 DI 引擎并从中获取依赖关系。