我应该在构造函数中实例化其他类吗?
最近,我看到了我的一个同事实例化一个构造他的课,所以我就开始做同样的,就像这样:我应该在构造函数中实例化其他类吗?
class FooBar{
private $model1;
private $model2;
public function __construct() {
$this->model1=new Model1();
$this->model2=new Model2();
}
}
而现在我开始想,如果可能实例化模型随处可见,其中他们需要可能会更好?
例如,功能foo()
需要模型1,功能bar()
需要模型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
是从的情况下,患的是“让我们抛开一切一个类的内部”,并应分成两类来代替。
如果一个类已经被实例化,那么所有这些实例化和测试都可以在一个单独的类中完成吗?像一个全局类实例化类?听起来有点变态,但它会使实例更具可重用性。 – 2011-03-06 13:55:11
@Janis:测试,没有。实例化,是的。您可以为'FooBar'构造函数提供回调函数,该函数将在调用时返回适当的模型,也可以一直使用依赖注入容器(http://www.google.com/search?q=+php+dependency + +注入容器)。 – Jon 2011-03-06 13:58:28
既然您的答案包含了对我有用的更多信息,我选择这个作为接受的答案。 – 2011-03-07 07:16:53
我想看到这些依赖注入的构造函数的参数。
是的,如果您需要创建其他类的实例,则注入一个可以创建它们的工厂。应提供依赖关系,而不是实例化的,以便您可以用模拟实例替换它们以进行测试。 – tvanfosson 2011-03-06 13:46:39
实际上应该在需要时加载它们,否则每次需要进行微不足道的操作时,不需要的一大堆模型(可能会有自己的构造函数加载更多模型!)会弹出到内存中。
,除非你确定你将使用它们(如模型所需定位和这样)
这不是精确的科学,你应该遵循怎样组织自己的直觉,不要创建新模型代码。
如果这种方法得到不可维护的,或者你想单元测试,依赖注入可能会出手相救。
但是,如果你正在做简单的脚本和开发时间是一个重要因素,你现在正在做的方式是足够的。
这取决于上下文。如果您不止一次调用方法,您是否想每次都实例化一个新模型?如果你想,是否真的有必要? – 2011-03-06 13:42:23