2011-03-06 131 views
3

最近,我看到了我的一个同事实例化一个构造他的课,所以我就开始做同样的,就像这样:我应该在构造函数中实例化其他类吗?

class FooBar{ 
private $model1; 
private $model2; 
    public function __construct() { 
     $this->model1=new Model1(); 
      $this->model2=new Model2(); 
    } 
} 

而现在我开始想,如果可能实例化模型随处可见,其中他们需要可能会更好?

例如,功能foo()需要模型1,功能bar()需要模型2,但现在两个模型都已加载。

所以,问题:这是实例其他类的正确方法?或者我应该在需要它们的时候实例化它们?

+0

这取决于上下文。如果您不止一次调用方法,您是否想每次都实例化一个新模型?如果你想,是否真的有必要? – 2011-03-06 13:42:23

回答

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是从的情况下,患的是“让我们抛开一切一个类的内部”,并应分成两类来代替。

+0

如果一个类已经被实例化,那么所有这些实例化和测试都可以在一个单独的类中完成吗?像一个全局类实例化类?听起来有点变态,但它会使实例更具可重用性。 – 2011-03-06 13:55:11

+0

@Janis:测试,没有。实例化,是的。您可以为'FooBar'构造函数提供回调函数,该函数将在调用时返回适当的模型,也可以一直使用依赖注入容器(http://www.google.com/search?q=+php+dependency + +注入容器)。 – Jon 2011-03-06 13:58:28

+0

既然您的答案包含了对我有用的更多信息,我选择这个作为接受的答案。 – 2011-03-07 07:16:53

2

我想看到这些依赖注入的构造函数的参数。

+0

是的,如果您需要创建其他类的实例,则注入一个可以创建它们的工厂。应提供依赖关系,而不是实例化的,以便您可以用模拟实例替换它们以进行测试。 – tvanfosson 2011-03-06 13:46:39

1

实际上应该在需要时加载它们,否则每次需要进行微不足道的操作时,不需要的一大堆模型(可能会有自己的构造函数加载更多模型!)会弹出到内存中。

,除非你确定你将使用它们(如模型所需定位和这样)

1

这不是精确的科学,你应该遵循怎样组织自己的直觉,不要创建新模型代码。

如果这种方法得到不可维护的,或者你想单元测试,依赖注入可能会出手相救。

但是,如果你正在做简单的脚本和开发时间是一个重要因素,你现在正在做的方式是足够的。

相关问题