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_Design Patterns_Dependency Injection - Fatal编程技术网

Php 您将依赖项放在哪里?

Php 您将依赖项放在哪里?,php,oop,design-patterns,dependency-injection,Php,Oop,Design Patterns,Dependency Injection,如果我使用依赖项注入模式来删除依赖项,它们会在其他地方结束 例如,代码片段1,或者我所说的对象生成器 我的意思是,你必须在某个地方实例化你的对象……所以当你把依赖项从一个对象中移出时,你最终会把它放到另一个对象中 我看到这将我的所有依赖项合并到一个对象中。这就是减少依赖性的关键所在,以便它们都位于一个尽可能靠近的位置 代码片段1-对象生成器 一、 就个人而言,我宁愿在有意义的地方实例化对象,并在一个特殊的文档文件中很好地记录依赖关系。就个人而言,我宁愿在有意义的地方实例化对象,并在一个特殊的文档

如果我使用依赖项注入模式来删除依赖项,它们会在其他地方结束

例如,代码片段1,或者我所说的对象生成器

我的意思是,你必须在某个地方实例化你的对象……所以当你把依赖项从一个对象中移出时,你最终会把它放到另一个对象中

我看到这将我的所有依赖项合并到一个对象中。这就是减少依赖性的关键所在,以便它们都位于一个尽可能靠近的位置

代码片段1-对象生成器


一、 就个人而言,我宁愿在有意义的地方实例化对象,并在一个特殊的文档文件中很好地记录依赖关系。

就个人而言,我宁愿在有意义的地方实例化对象,并在一个特殊的文档文件中很好地记录依赖关系。

只要问问自己,这是属于一起的吗

如果某物是你的物体的一部分,那么可能是的。如果某物是的属性,那么是的

:

我能提供的最佳指南是什么?从PHP手册:

PHP类可以用于多种用途,但最基本的用途是 级别,您将使用类来组织和处理志同道合的人 数据

附言: 在您首先需要的位置创建一个对象

缴费灵:
将所有依赖项合并到一个对象中。。。如果聚集在一起的对象不一定与彼此有任何直接关系。。。这可能是你能做的最糟糕的事情了。我怎么…

问问你自己,这是属于一起的吗

如果某物是你的物体的一部分,那么可能是的。如果某物是的属性,那么是的

:

我能提供的最佳指南是什么?从PHP手册:

PHP类可以用于多种用途,但最基本的用途是 级别,您将使用类来组织和处理志同道合的人 数据

附言: 在您首先需要的位置创建一个对象

缴费灵: 将所有依赖项合并到一个对象中。。。如果聚集在一起的对象不一定与彼此有任何直接关系。。。这可能是你能做的最糟糕的事情了。我想

这就是减少依赖性的关键所在,以便它们都位于一个尽可能靠近的位置

我想基本上就是这样,是的。其思想是使应用程序的组件松散耦合。这意味着您可以更轻松地重用组件、交换组件和测试组件。如果您有一个简单的应用程序,那么在需要的地方实例化对象当然是非常好的。但随着代码变得越来越复杂,具有多个嵌套依赖项,您的代码可能会变得紧密耦合,这意味着难以维护、调整和测试

这就是减少依赖性的关键所在,以便它们都位于一个尽可能靠近的位置


我想基本上就是这样,是的。其思想是使应用程序的组件松散耦合。这意味着您可以更轻松地重用组件、交换组件和测试组件。如果您有一个简单的应用程序,那么在需要的地方实例化对象当然是非常好的。但随着代码变得越来越复杂,具有多个嵌套依赖项,您的代码可能会变得紧密耦合,这意味着很难维护、调整和测试。

不,这与整合依赖项无关。它与使对象更易于测试有关

是的,一个副作用是您的依赖关系往往显示在其他地方,但关键是依赖关系不在您正在测试的对象中

如果您没有在目标对象中创建依赖项,那么您可以实例化测试对象、伪对象或模拟对象,以提供给您的目标对象。如果对象创建了自己的依赖项,那么这是不可能的

这样想吧。假设你有一个汽车物体。如果汽车创造了司机,那么其他司机就没有办法驾驶它。它只能是一辆全富汽车,因为你有一个硬编码的司机创建

现在,让我们开发一个机器人,在专门设计的赛道上测试汽车。再说一次,我们不能把机器人放在驾驶座上,因为你在那里会被硬编码


当然,可测试性只是依赖项注入的一个好处,依赖项的强制解耦意味着您必须编写更多的模块化代码。如果您正在巧妙地使用依赖项注入框架,或者类似的框架,那么您可以根据需要使依赖项自动实例化,这有很多好处,但对于更强的类型化语言来说,这往往是一个更大的好处。

不,这与整合依赖项无关。它与使对象更易于测试有关

是的,一个副作用是您的依赖关系往往出现在其他地方,但poi nt是指依赖项不在您正在测试的对象中

如果您没有在目标对象中创建依赖项,那么您可以实例化测试对象、伪对象或模拟对象,以提供给您的目标对象。如果对象创建了自己的依赖项,那么这是不可能的

这样想吧。假设你有一个汽车物体。如果汽车创造了司机,那么其他司机就没有办法驾驶它。它只能是一辆全富汽车,因为你有一个硬编码的司机创建

现在,让我们开发一个机器人,在专门设计的赛道上测试汽车。再说一次,我们不能把机器人放在驾驶座上,因为你在那里会被硬编码

当然,可测试性只是依赖项注入的一个好处,依赖项的强制解耦意味着您必须编写更多的模块化代码。如果您正在巧妙地使用依赖项注入框架或类似的框架,那么您可以根据需要使依赖项自动实例化,这有很多好处,但使用更强的类型化语言往往会带来更多好处。

引用

在传统的软件开发中,依赖对象自行决定将使用哪些具体类。在依赖项注入模式中,该决策被委托给注入器,注入器可以选择在运行时而不是在编译时替换依赖项契约接口的不同具体类实现

DI导致某些类与不稳定类的耦合较少。注入的实例通常是接口的实现。OCP告诉我们,实现中的更改不应该要求修改依赖于它们的封闭类

tl;只依赖注入接口I的实现的dr类更具内聚性,其职责更少。其他一些类被困在选择、实例化等职责中,但该类也更具内聚性

引用

在传统的软件开发中,依赖对象自行决定将使用哪些具体类。在依赖项注入模式中,该决策被委托给注入器,注入器可以选择在运行时而不是在编译时替换依赖项契约接口的不同具体类实现

DI导致某些类与不稳定类的耦合较少。注入的实例通常是接口的实现。OCP告诉我们,实现中的更改不应该要求修改依赖于它们的封闭类


tl;只依赖注入接口I的实现的dr类更具内聚性,其职责更少。其他一些类被困在选择、实例化等职责中,但该类也更具内聚性

你如何表达一个问题决定你得到的答案真的很奇怪。这篇文章有相反的语气——你如何表达一个问题决定你得到的答案真的很奇怪。这篇文章有相反的语气——这取决于你的代码的复杂度……在我开始使用它之前,我已经用了大约1200行了。这是独立的考虑到您的代码的复杂性……在开始使用之前,我已经用了大约1200行。@allfoo-依赖项必须存在于某个地方,否则它们就不是依赖项。尽管我在上面说过,它们并没有实例化它们自己,有些东西仍然在创建它们。我把我所有的东西都放在一个名为ObjectMaker的文件中,刚刚发布在上面,我仍然需要抽象出公共元素。@allfoo-依赖项必须存在于某个地方,否则它们不是依赖项。尽管我在上面说过,他们并没有实例化他们自己,有些东西仍然在创建他们。我把我所有的东西都放在一个名为ObjectMaker的文件中,我刚刚在上面发布了它,我仍然需要抽象出公共元素。
<?php

class ObjectMaker
{
    public function makeSignUp()
    {
        $DatabaseObject = new Database();
        $TextObject = new Text();
        $MessageObject = new Message();

        $SignUpObject = new ControlSignUp();        
        $SignUpObject->setObjects($DatabaseObject, $TextObject, $MessageObject);
        return $SignUpObject;
    }
    public function makeSignIn()
    {
        $DatabaseObject = new Database();
        $TextObject = new Text();
        $MessageObject = new Message();

        $SignInObject = new ControlSignIn();
        $SignInObject->setObjects($DatabaseObject, $TextObject, $MessageObject);
        return $SignInObject;
    }
    public function makeTweet( $DatabaseObject = NULL, $TextObject = NULL, $MessageObject = NULL )
    {
        if( $DatabaseObject == 'small' )
        {
            $DatabaseObject = new Database();
        }
        else if( $DatabaseObject == NULL )
        {
            $DatabaseObject = new Database();
            $TextObject = new Text();
            $MessageObject = new Message();
        }
        $TweetObject = new ControlTweet();        
        $TweetObject->setObjects($DatabaseObject, $TextObject, $MessageObject);
        return $TweetObject;
    }
    public function makeBookmark( $DatabaseObject = NULL, $TextObject = NULL, $MessageObject = NULL )
    {
        if( $DatabaseObject == 'small' )
        {
            $DatabaseObject = new Database();
        }
        else if( $DatabaseObject == NULL )
        {
            $DatabaseObject = new Database();
            $TextObject = new Text();
            $MessageObject = new Message();
        }

        $BookmarkObject = new ControlBookmark();        
        $BookmarkObject->setObjects($DatabaseObject,$TextObject,$MessageObject);
        return $BookmarkObject;
    }
}