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


Which method is more efficient in constructing classes?

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

示例

$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);
    }
}

我想知道的是,这是否有效,其中哪个选项更好,是否还有其他更好的解决方案。

免责声明:不是PHP开发人员,但我对OOP的理解足以用。。。

选项2更好。

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

对于选项2,A声明它需要一个$b来创建自己。这使您能够在实例化A的任何位置将$b的实例替换为您想要的任何实例,而且它还使每段代码的需求更加清晰,从而使代码更易于维护。这很好,因为A不在乎B是否工作,以便A工作。它只是处理注入的类。。其可以是也可以不是作为黑盒的CCD_ 8-。它是松散耦合的,仅依赖于B接口,而不是实现。

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

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