PHP和DIC中的依赖注入

PHP和DIC中的依赖注入,php,dependency-injection,Php,Dependency Injection,我有一根骨头要挑依赖注入。似乎这样一个简单的概念已经导致了许多人的困惑,“正确”的方法似乎在复杂性方面失去了控制。为了让事情变得简单,我只想知道: 如果我使用标准函数来注册依赖项,这是否是一种良好的做法,如: function someObject() { return new someObject(); } 我可以传递参数吗 function someObject($param1) { return new someObject($param1); } 最后,使用一个简单的自定义容

我有一根骨头要挑依赖注入。似乎这样一个简单的概念已经导致了许多人的困惑,“正确”的方法似乎在复杂性方面失去了控制。为了让事情变得简单,我只想知道:

如果我使用标准函数来注册依赖项,这是否是一种良好的做法,如:

function someObject() {
  return new someObject();
}
我可以传递参数吗

function someObject($param1) {
  return new someObject($param1);
}
最后,使用一个简单的自定义容器类如何:

class Dependencies {
  function someObject($param1) {
    return new someObject($param1);
  }
}
使用它:

class SomeClass {
  public function __construct(Dependencies $dependencies) {
    $this->dependencies = $dependencies
  }

  public function methodNeedsDependency() {
    $param1 = 'one';
    $task = $this->dependencies->someObject($param1);
  }
}
我想我要问的是,这是一个非常简单的DIC实现的合理尝试吗?还是表面下有一些潜在的重大问题


谢谢

如果
SomeClass
是一个工厂,设计用于创建具有给定精确配置的实例,那么是的,我们可以说这是DIC的非常简单的实现

这里有什么问题?假设您想使用其他构造函数参数创建
someObject

解决方案:

  • 创建另一个将传递其他参数的
    SomeClass
    工厂。它的冗余解决方案还混合了两个应用程序层(配置层和对象创建层)

  • 使用将传递给
    someObject
    的参数对
    methodneedsdependence
    进行参数化。它允许您延迟代码配置的创建

  • 最后也是最合适的方法:DIC应该是灵活的,应该允许您创建任何依赖的服务实例,所有配置都应该存储在配置层中。关注点分离-尝试使DIC不知道正在创建的对象类型。让他制作你在其他地方描述的东西

  • 还有很多其他问题,例如,如果您希望整个DIC只有一个给定类的实例,该怎么办(很容易“如果”它,但这是正确解决方案的另一个解决方法),或者使用循环引用怎么办


    一般来说,这个讨论可以继续讨论关于体系结构的其他问题,比如“服务应该是无状态的”是什么使得不需要有多个服务,但您的问题的答案是这三点。当然要记住,这并不是DIC的终极答案。这只是我的看法;-)

    如果
    SomeClass
    是一个工厂,设计用于创建具有给定精确配置的实例,那么是的,我们可以说这是DIC的非常简单的实现

    这里有什么问题?假设您想使用其他构造函数参数创建
    someObject

    解决方案:

  • 创建另一个将传递其他参数的
    SomeClass
    工厂。它的冗余解决方案还混合了两个应用程序层(配置层和对象创建层)

  • 使用将传递给
    someObject
    的参数对
    methodneedsdependence
    进行参数化。它允许您延迟代码配置的创建

  • 最后也是最合适的方法:DIC应该是灵活的,应该允许您创建任何依赖的服务实例,所有配置都应该存储在配置层中。关注点分离-尝试使DIC不知道正在创建的对象类型。让他制作你在其他地方描述的东西

  • 还有很多其他问题,例如,如果您希望整个DIC只有一个给定类的实例,该怎么办(很容易“如果”它,但这是正确解决方案的另一个解决方法),或者使用循环引用怎么办


    一般来说,这个讨论可以继续讨论关于体系结构的其他问题,比如“服务应该是无状态的”是什么使得不需要有多个服务,但您的问题的答案是这三点。当然要记住,这并不是DIC的终极答案。这只是我的看法;-)

    简单而彻底的回答。。。那么,当你说“创建一个实例,并提供一些精确的配置”时,你的意思是需要在容器级别提供配置吗?或者,按照第2步中提到的参数化是否合理,在后面的阶段将其作为参数传递?配置应该在…上给出,配置层:)创建配置文件(YAML、XML、TXT,无论什么),在这里您确切地说出要传递给实例的内容。Symfony容器的配置就是一个很好的例子。查看服务是如何定义的。简单而彻底的回答。。。那么,当你说“创建一个实例,并提供一些精确的配置”时,你的意思是需要在容器级别提供配置吗?或者,按照第2步中提到的参数化是否合理,在后面的阶段将其作为参数传递?配置应该在…上给出,配置层:)创建配置文件(YAML、XML、TXT,无论什么),在这里您确切地说出要传递给实例的内容。Symfony容器的配置就是一个很好的例子。查看服务是如何定义的。