我应该在构造函数中实例化其他类吗?

时间:2011-03-06 13:37:54

标签: php object

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

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

现在我开始怀疑,如果可能在所需的地方实例化模型可能会更好?

例如,函数foo()需要model1而函数bar()需要model2,但现在两个模型都已加载。

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

4 个答案:

答案 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)

这不是确切的科学,你应该按照自己的直觉来组织代码。

如果这种方法无法维护,或者您想对其进行单元测试,那么依赖注入可能会受到拯救。

但是,如果您正在进行简单的脚本并且开发时间是一个重要因素,那么您现在的方式就足够了。