【问题标题】:PHP Dependency Injection for Child Classes子类的 PHP 依赖注入
【发布时间】:2012-01-03 10:58:20
【问题描述】:

我正在尝试找出 PHP 中依赖注入的最佳实践。

问题:我必须将子类的所有依赖项都注入到父类中吗?我在组合关系方面使用术语“父”和“子”。

我的犹豫是因为我发现自己给父类提供了各种依赖项,以便它可以将它们传递给依赖的子类。

编辑:

下面是我所说的更具体的例子。 MyClassA 不需要数据库连接对象或记录器。但是,DoSomething 确实需要这些对象。获取数据库连接和记录到DoSomething 实例的最佳方法是什么?为了单元测试,我不想使用单例对象或全局对象。此外,此示例仅用于类。如果有 3 个或 4 个,而第 3 个或第 4 个需要一些对象实例,但前 2 个或 3 个不需要,该怎么办? MyClassA 是否只是将对象传递给下一个,等等?

class MyClassA {
  protected $_doSomethingObject;

  public function doSomething()
  {
    return $this->_doSomethingObject()->doSomethingElse();
  }

  public function setDoSomethingObject($doSomethingObject)
  {
    $this->_doSomethingObject = $doSomethingObject;
  }
}

class DoSomething {
  protected $_logger;
  protected $_db;

  public function doSomethingElse()
  {
     $this->_logger->info('Doing Something');
     $result = $this->_db->getSomeDataById();
     return $results;
  }

  public function setLogger($logger)
  {
     $this->_logger = $logger;
  }

  public function setDBConection($db)
  {
     $this->_db = $db;
  }
}

我在下面展示的示例是最好的方法吗?如果是这样,那么最好的方法就是向后工作......?

    $logger = new Logger();
    $db = new DBConnection();    

    $doSomething = new DoSomething();
    $doSomething->setLogger($logger);
    $doSomething->setDBConnection($db);

    $a = new MyClassA();
    $a->setDoSomething($doSomething);

【问题讨论】:

  • 大多数情况下,这些子对象不是注入到父对象中了吗?如果是这样,您首先要在将这些对象注入父对象之前注入它们的依赖项。你有什么简单的具体例子吗?
  • 我添加了一些伪代码来查看。感谢您的回复!
  • 得墨忒耳法则这样的东西。阅读它。

标签: php dependency-injection


【解决方案1】:

如果是这样,那么最好的方法就是向后工作......?

是的。正如我在评论中提到的,您首先设置了最里面的对象。

如果一个对象在内部创建了另一个未公开的对象,那么它可以在适当的情况下传递其注入的对象。例如:

class DoSomething {
// ...
  public function foo() {
    $foo = new Foo();
    $foo->setLogger($this->_logger);
    return $foo->bar();
  }
}

但是,如果那个秘密 Foo 对象需要引用 DoSomething 没有的其他东西,那么你就有了设计问题。如果发生这种情况,您需要做任何适当的事情:

  • 在调用foo()之前将foo对象注入父对象。
  • 在调用 foo() 之前将该依赖项注入到父对象中。
  • 将依赖项添加为函数参数。
  • 将代码重构为不会产生该问题的更好设计。

【讨论】:

    【解决方案2】:

    您只需在将直接需要它们的类中包含依赖项。由于每次加载基类时都会加载所需/包含的文件,因此它们将自动可供任何子类使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2017-02-13
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多