Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 处理依赖注入&;任意简单类_Php_Oop_Dependency Injection - Fatal编程技术网

Php 处理依赖注入&;任意简单类

Php 处理依赖注入&;任意简单类,php,oop,dependency-injection,Php,Oop,Dependency Injection,我正在重构一个中等规模的MVC框架,以使用依赖注入,从服务定位器类+各种其他技术的混合,转向类似于Laravel的更一致的服务提供者/服务容器模型。总的来说,进展顺利 我正在逐步淘汰并试图避免的事情之一是对服务容器本身的依赖。当我转向某些类型的类的工厂时,这是正常的,当涉及到更重要的结构骨骼(如控制器和存储库等)时,这似乎是很有意义的,我一直在绞尽脑汁想的一件事是,如何为简单类做到这一点,您可能需要加载各种实例,只需要这里或那里的奇数实例,或者需要就地构建。例如,我可能想实例化一个REST客户机

我正在重构一个中等规模的MVC框架,以使用依赖注入,从服务定位器类+各种其他技术的混合,转向类似于Laravel的更一致的服务提供者/服务容器模型。总的来说,进展顺利

我正在逐步淘汰并试图避免的事情之一是对服务容器本身的依赖。当我转向某些类型的类的工厂时,这是正常的,当涉及到更重要的结构骨骼(如控制器和存储库等)时,这似乎是很有意义的,我一直在绞尽脑汁想的一件事是,如何为简单类做到这一点,您可能需要加载各种实例,只需要这里或那里的奇数实例,或者需要就地构建。例如,我可能想实例化一个REST客户机几次,或者某种字符串处理实用程序,将其传递到构造函数中,但我也可能只想在15个存储库中的1个上执行此操作,这些存储库已经有了自己的工厂类

  • 为小东西创建一个工作服工厂显然是不可能的,因为它们涉及不同的东西,你失去了封装性/目的的清晰性
  • 为每一个类创建一个特定的工厂类似乎有点过头了,同时将它注入到每一种类型的类中也有点过头了(即上面提到的15个类中有14个不需要它)
  • 包括服务容器在某种程度上违背了练习的目的
  • 拥有一个全局“make”函数(比如Laravel4中的App:make(),尽管它实际上不是一个普通的静态调用)会让我们回到全局,远离依赖注入
  • 拥有一个静态构造函数(例如Symfony中的Request::createFromGlobals)会阻止我实际注入所需的东西
到目前为止,我已经注入了15个中的1个所需的类,并在一种情况下使用它,在另一种情况下,它实际上不需要任何依赖项,所以我直接去实例化它,尽管我的直觉告诉我不要(猜猜看,我的直觉是对的,一天后它现在可能可以使用依赖项或至少是构造服务).

你读到的大多数建议都只是针对大局/理想化的例子,但感觉可能只是在项目的边缘有一点你不得不捏造的细节。有人说会在事后在then settings属性中传递实例,但这感觉根本不对,特别是如果您想要多个副本,那么当您真正想要一个新副本时,您将不得不清除状态之类的内容

那么我该如何改进这一点呢?课程本身有问题吗?整体结构有问题吗


谢谢。

这个类的生存期是多久,1分还是15分?我想,在这种特殊情况下,“工厂”实际上是一个注册表?因为它创建的类的实例保留在它上面并被重用(除了构造需求之外,它们实际上是无状态的)。它是一堆业务逻辑所在的地方,是以前缺失的层的一部分,现在位于控制器和数据源之间。这个特殊的程序处理规则的某一部分(记住用户)并加密某些数据,它是唯一需要加密的程序。你听说过吗?我对同样大小的代码库进行了类似的重构,这真的救了我的命。我没听说过。不,谢谢。看一看,它并没有真正解决我的问题,只是重复了关于不让喷油器进入的常识,而没有实际解释如何避免我描述的情况。虽然这可能会使一类集合使用不同于其他集合的构造参数变得更容易,但这在技术上我已经可以实现,例如,在工厂使用开关(虽然很笨重)。