了解如何注入对象依赖项

时间:2010-06-12 01:03:40

标签: php dependency-injection

我有一个对象,它在方法中加载另一个对象的实例。

$survey   = new survey;

$question = new question($survey);

$question->load($question_id);

class question  {

public function __construct(&$survey)
{   
    $this->survey = $survey;
}   

public function load ($id)
{   
    // now a question is loaded
    // want to load the survey that this question is in
    $this->survey->load($this->get('survey_id')); // ** survey_id is a field in the questions table
    // now $this->survey object has all the info about the survey this question is in
}   

private function get($name)
{   
    // returns $name, if isset() from array that load() sets
}    }
然而,这是在煎炸我的大脑,因为看起来美元调查应该成为一个完整的对象。但是,如果我不知道要加载什么survey_id,直到我在对象中,我该怎么做呢?我正在修改一个网站,最复杂的部分是乱丢这个问题。 TIA - Hans。

1 个答案:

答案 0 :(得分:1)

编辑:我刚刚注意到你提到你在现有代码中遇到了这个问题。我在下面所说的可能仍然适用于解决你的问题,但它实际上可能不是立即有建设性的用途。 :)不幸的是,我们需要看到更多代码来帮助解决您的问题,因为您向我们展示的内容是奇怪的。


你似乎已经在里面构建了你的课程。

调查通常被定义为一组问题。

因此,您的Survey类不应该包含和引用问题,而不是相反吗?

您可以将他们的关系存储在一个链接表中,这将允许调查查找他们的问题,同时还允许问题查找他们所在的调查。在每个类中创建访问器方法以查找其中的依赖关系链接表并返回对象的ID或对象本身。这种方法使得对象不那么紧密地联系在一起。

(将此扩展到用户回答问题,事情变得更有趣。如果我这样做,我会为每个用户的响应创建一个类(每个用户获得一个响应),其中包含Answers。响应引用调查,每个答案引用一个问题。)

这可能不是依赖注入适用的情况。当传递的对象的实际类可能发生变化,或者外部力量可以控制传入的对象时,最常使用DI。您是否曾期望调查将包含不是问题的内容?或者问题将存在于不是调查的内容中​​?或者说,调查或问题相关内容之外的力量会操纵问题?如果你对这些回答“否”,那么DI可能不是你想要的。

相关问题