【问题标题】:Understanding how to inject object dependencies了解如何注入对象依赖项
【发布时间】:2010-06-12 11:31:04
【问题描述】:

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

$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 应该成为 $question 已经是一个完整的对象。但是,如果我在进入对象之前不知道要加载什么survey_id,我该怎么做?我正在改造一个网站,最复杂的部分是散布这个问题。 TIA - 汉斯。

【问题讨论】:

  • $响应?您可能想稍微修改一下您的帖子。
  • 是的:脑筋急转弯。我从“回应”开始,然后决定“问题”更容易传达。已编辑。

标签: php dependency-injection


【解决方案1】:

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


你似乎已经从里到外构建了你的类。

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

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

您可以将它们的关系存储在链接表中,这将允许调查查找他们的问题,同时还允许问题查找他们所在的调查。在每个类中创建访问器方法以查找链接表并返回对象的 ID 或对象本身。这种方法可以减少对象之间的紧密联系。

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

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

【讨论】:

  • 好的,谢谢。这很有帮助。我会考虑在另一个方向构建它并在另一个方向传递 $questions。
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2021-08-04
  • 2011-11-22
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多