对于我数据库中的每一堆记录,我实例化一个类。在那个班里,我叫另一个班。
$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);
}
}
我想知道的是,如果这是有效的,哪些选项更好,如果有更好的其他解决方案。
答案 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。这不是效率问题,而是可维护性。