哪种方法在构造类时更有效?

时间:2015-03-04 11:24:22

标签: php class oop dependency-injection

对于我数据库中的每一堆记录,我实例化一个类。在那个班里,我叫另一个班。

实施例

$records = array(...);
foreach ($records as $record) {
    $a = new A();
    $data = $a->doSomething($record);
}

class A {
    protected $b;
    public function __construct()
    {
        $this->b = new B();
    }

    public function doSomething($param)
    {
        return $this->b->doSomething($param);
    }
}

上面的代码是我目前正在做的方式。但是我想知道下面会不会更好:

$records = array(...);
$b = new B();
foreach ($records as $record) {
    $a = new A($b);
    $data = $a->doSomething($record);
}

class A {
    protected $b;
    public function __construct($b)
    {
        $this->b = $b;
    }

    public function doSomething($param)
    {
        return $this->b->doSomething($param);
    }
}

我想知道的是,如果这是有效的,哪些选项更好,如果有更好的其他解决方案。

1 个答案:

答案 0 :(得分:3)

免责声明:不是PHP开发者,但我理解OOP足以用......来回答这个问题。

选项2更好。

这不是效率问题,而是一种称为依赖注入的最佳实践。

使用选项2,A声明它需要$b来创建自己。这使您能够在实例化$b的任何地方将A的实例替换为您想要的任何内容,并且通过使每段代码的要求更多来使代码更易于维护明确。这很好,因为A并不关心B是否有效,以便A能够正常工作。它只是处理注入的类...它可能是B,也可能不是B - 作为一个黑盒子。它是松散耦合,只取决于B接口,而不是实现。

使用选项1,您可以在类中实例化B。这很好......直到你想测试你的代码。或者在运行时更改A。然后它变得非常脆弱。因为每次您想要更改B,您现在都必须更改A。这意味着B现在紧密耦合A,这实际上意味着B工作,它还取决于{{1}}工作 - 这不是很容易维护,因为你的应用程序基本上成了纸牌屋。

TLDR - 始终使用选项2。这不是效率问题,而是可维护性。