在PHP中查询依赖注入

时间:2011-12-09 01:11:59

标签: php oop dependency-injection loose-coupling

我一直在阅读依赖注入,我想我非常理解这些概念,包括构造函数注入和setter注入。

但是,我不确定在以下情况下我会做什么:

假设我有一个有很多方法的类,但这些方法中只有一个需要某个其他对象。如何为该方法提供此对象?我不应该直接将对象作为参数直接传递给方法:

class aClass
{
    function aMethod(anotherClass $anotherClass)
    {
        anotherClass->hello();
    }

    function otherMethods()
    {
    }
    .....
}

另一种选择是将它提供给整个班级,这似乎是不必要的。像这样:

class aClass
{
    protected $_anotherClass;

    function aMethod()
    {
        anotherClass->hello();
    }

    function otherMethods()
    {
    }
    .....

    function setAnotherClass(anotherClass $anotherClass)
    {
            $this->_anotherClass;
    }
}

我应该何时将对象传递给方法,何时应该通过构造函数/ setter使用依赖注入? 是否有一个经验法则或何时使用这两个选项之一的最佳实践?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你提到了经验法则,所以这里是:

问自己一个问题: 有人可以合法地在同一个对象上调用此方法两次,为两次调用中的参数提供不同的值吗?

如果是,则将其保留为参数。如果不是,那么它就像你描述的那样是一个很好的注射候选者。

This是第一种类型的方法的一个很好的例子,其中删除参数并在类中注入依赖项将是一个非常糟糕的主意。 C#而不是PHP,但你得到了图片。

答案 1 :(得分:1)

一个班级的内部运作是没有业务的,但那个班级本身。如果只有一个函数需要依赖,那就这样吧。

或者你可能想知道为什么只有一个函数具有依赖性,你是否可以做两个单独的事情?

您不希望在构造函数中注入依赖项的唯一原因是制作该资源的成本非常高(在磁盘上准备好大文件,连接到远程主机等),但即使在这种情况下,您可以将“代理”或“延期”对象作为“承诺”传递给您,以便在需要时可以访问依赖项。

相关问题