最近,我看到我的一位同事在构造函数中实例化了他的类,所以我开始这样做了,就像这样:
class FooBar{
private $model1;
private $model2;
public function __construct() {
$this->model1=new Model1();
$this->model2=new Model2();
}
}
现在我开始怀疑,如果可能在所需的地方实例化模型可能会更好?
例如,函数foo()
需要model1而函数bar()
需要model2,但现在两个模型都已加载。
所以,问题是:这是实例化其他类的正确方法吗?或者我应该在函数中需要它们时实例化它们吗?
答案 0 :(得分:2)
我希望看到这些依赖项作为参数注入到构造函数中。
答案 1 :(得分:2)
嗯,一如往常,没有一种尺寸适合所有答案。
大部分时间,类FooBar
聚合$model1
和$model2
,因为它需要它们来完成其功能。在这种情况下,FooBar
可以做的事情并不多,除非它在这些变量中有对象,所以在构造函数中创建它们是正确的。
有时不需要聚合对象来执行类FooBar
的大部分功能,并且构造该对象是一项昂贵的操作。在这种情况下,仅使用以下代码构建它是有意义的:
class FooBar {
private $model1;
private $model2;
public function Frob() {
$model = $this->getModel1();
$model->frob();
}
private function getModel1() {
if ($this->model1 === null) {
$this->model1 = new Model1;
}
return $this->model1;
}
}
然而,这只是有时。如果班级FooBar
的一半操作需要$model1
而另一半需要$model2
,这可能表明FooBar
正在遭遇“让我们把一切都扔进去“并且应该分成两个类。
答案 2 :(得分:1)
实际上你应该在需要时加载它们,否则每次你需要完成一个简单的操作时,一大堆不需要的模型(可能有自己的构造函数加载更多模型!)会弹入内存。
除非您确定要使用它们,否则不要创建新模型(例如需要本地化的模型等)
答案 3 :(得分:1)
这不是确切的科学,你应该按照自己的直觉来组织代码。
如果这种方法无法维护,或者您想对其进行单元测试,那么依赖注入可能会受到拯救。
但是,如果您正在进行简单的脚本并且开发时间是一个重要因素,那么您现在的方式就足够了。