【问题标题】:How to properly inject dependencies in PHP如何在 PHP 中正确注入依赖项
【发布时间】:2013-04-24 16:25:37
【问题描述】:

我遇到了一些依赖注入问题,我想澄清一下。首先要提的是我实现的一个依赖注入容器(DIC),它能够通过构造函数使用ReflectionClass注册和解析依赖。

$container = new DiC;
$container->register('session', 'CSession');
$container->register('response', 'CResponse');
$container->register('model', 'CSomeModel');
$container->register('view', 'CSomeView');
$container->register('controller', 'CSomeController');

从属控制器:

class CSomeController extends CController
{
  public function __construct(CSomeModel $model, CSomeView $view)
  {
    // assign arguments here
  }
}

现在可以通过DIC实例化控制器了:

$controller = $container->resolve('controller');

我喜欢这种方法,因为它是自动化的和描述性的,但是类 CController 依赖于特定的类 CSomeModel、CSomeView,这很糟糕。 MVC 三元组应该独立​​实例化 - 例如,我不能将 COtherView 传递给 CSomeController。

我的第二个猜测是注入 DIC:

class CSomeController extends CController
{
  public function __construct(DiC $dic)
  {
    // resolve dependencies through $dic
  }
}

这使得 DiC 对象全局化,很多人认为这不是实现 DI 的方式。

是否有第三种方法可以消除这两种方法的弱点?

【问题讨论】:

标签: php design-patterns dependency-injection


【解决方案1】:

如果您正在寻找“自动装配”,请切换到接口并实现您的具体模型/视图/等。针对该接口的类。这样你就可以使用反射来配对双方。

拥有一种在容器级别显式指定依赖关系的机制也是有意义的。

【讨论】:

  • 这方面有教程吗?
【解决方案2】:

我认为这两种方法都是相关的。如果您想在第一种方法中更加灵活,您可以更改构造函数以将父类作为依赖项。然后可以注入从该父类继承的每个对象。即

class CSomeModel extends AbstractCModel {}
class CSomeOtherModel extends AbstractCModel {}

public function __construct(AbstractCModel $model, AbstractCView $view) {}

如果您需要访问工厂,则第二种方法适用。 IE。如果您需要访问同一对象的多个实例。

【讨论】:

  • IoC 类使用 PHP 反射解决依赖关系。通过注入抽象类,我失去了自动化......
  • 接口比抽象类好。
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2014-04-19
相关资源
最近更新 更多