了解疙瘩

Ann*_* K. 16 php dependency-injection

我不明白这个"DI容器"是如何使用的.官方网站上显示的例子告诉我什么:http://pimple.sensiolabs.org

基本上我有一个简单的站点,它由一组类组成:DB类,Cache类,User类和一些处理内容类型的类.

所有这些类都像是在Pimple中提到的"服务",每个服务都应该能够调用另一个服务.现在我正在实例化主类中的服务,我使用它像单例一样在其他类之间共享服务.

从我读到的内容来看,Pimple确实做到了这一点,但我该如何使用呢?:■

Gor*_*don 19

http://phpmaster.com/dependency-injection-with-pimple/上有一个教程,解释如何将Pimple用作DIC.

另一种(但不一定是推荐的)方法是将容器注入到需要它的所有组件中(例如,你像ServiceLocator一样使用它)然后你只需要做文档说你应该做的事情来从Pimple获取一个对象:

class SomeClassThatNeedsSession
{
    private $session;
    public function __construct(Pimple $container) 
    {
        $this->session = $container['session'];
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,您只需获取所需内容,然后Pimple将处理该对象的生命周期,例如是否需要创建或重用它.OffsetGet是ArrayAccess接口的一部分,它允许你像一个数组一样访问一个Object,所以当你做的时候,$container['foo']Pimple将检查它是否有一个为foo定义的闭包,它是否只是一些参数并相应地组装服务.

Pimple是关于Lambdas和Closures博客文章的结果,您可能希望阅读它以更好地理解它是如何工作的.

  • 给一个类整个容器认为是好的做法吗?这是否略微违反了demeter定律,因为你提供的课程超出了工作所需的范围? (5认同)
  • @AgmLauncher Demeter法则不适用于根据LoD上的原始文件创建对象的方法.由于服务定位器实际上是工厂创建对象,因此它并没有真正违反LoD.但是,所有使用服务定位器的类都会依赖SL然后阻碍重用,因此最好不要像使用它一样使用它,而是按照我给出的第一个链接中的建议用法. (2认同)