当前位置: 首页 > 编程笔记 >

PHP 二传手注射

岳良策
2023-03-14
本文向大家介绍PHP 二传手注射,包括了PHP 二传手注射的使用技巧和注意事项,需要的朋友参考一下

示例

设置程序也可以注入依赖项。

interface Logger {
    public function log($message);
}

class Component {
    private $logger;
    private $databaseConnection;

    public function __construct(DatabaseConnection $databaseConnection) {
        $this->databaseConnection = $databaseConnection;
    }

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

    public function core() {
        $this->logSave();    
        return $this->databaseConnection->save($this);
    }

    public function logSave() {
         if ($this->logger) {
            $this->logger->log('saving');
        }
    }
}

当类的核心功能不依赖于依赖项来工作时,这尤其有趣。

在这里,唯一需要的依赖关系就是DatabaseConnection它的构造函数。该Logger依赖性是可选的,因此并不需要成为构造的一部分,使类更容易使用。

请注意,使用setter注入时,最好扩展功能而不是替换它。设置依赖项时,没有任何东西可以确认依赖项在某个时候不会改变,这可能会导致意外结果。例如,FileLogger可以首先设置a ,然后再MailLogger设置a。这会破坏封装并使日志难以查找,因为我们正在替换依赖项。

为了防止这种情况,我们应该setter注入中添加一个依赖项,如下所示:

interface Logger {
    public function log($message);
}

class Component {
    private $loggers = array();
    private $databaseConnection;

    public function __construct(DatabaseConnection $databaseConnection) {
        $this->databaseConnection = $databaseConnection;
    }

    public function addLogger(Logger $logger) {
        $this->loggers[] = $logger;
    }

    public function core() {
        $this->logSave();
        return $this->databaseConnection->save($this);
    }

    public function logSave() {
        foreach ($this->loggers as $logger) {
            $logger->log('saving');
        }
    }
}

这样,每当我们使用核心功能时,即使没有添加记录器依赖项,它也不会中断,并且即使可以添加另一个记录器,添加的记录器也将被使用。我们正在扩展功能,而不是取代它。

 类似资料:
  • 我的问题是,我不知道使用什么代码从我的getX方法到我的其他类主方法来获取我的值。 公共级刽子手{ } 这是来自子类的,我试图将triesLimit的值存储到这个类的main方法包hangman的main中; 我试着在这里查找,但找不到子/超类中使用的setter和getter

  • 问题内容: 对不起这个基本问题。我是GoLang的新手。 我有一个名为的自定义类型,我不希望其中的变量直接由调用者使用,而是希望使用/ 方法来实现 下面是我的 这是我的功能 但是我无法继续进行..您能帮我实现GoLang中的吸气剂概念吗? 问题答案: 如果要使用setter,则应使用方法声明: 然后您将可以使用: 这种声明使您可以通过使用以下命令在结构上执行功能 您正在传递指向结构的指针,因此对其

  • 问题内容: 我的二传手迅速遇到了一个奇怪的问题。我有带有代码的PlayingCard类: 我在另一个类中使用此init()方法,实现如下所示: 当代码看起来像上面的代码时,我在一行中遇到了一个错误: 但是,当我从 等级 和 西服 属性中删除setter和getter时,它工作正常,没有出现错误。 您能解释一下为什么出现此 EXC_BAD_ACCESS 错误吗? 谢谢您的帮助 问题答案: 通过写这个

  • 本文向大家介绍春季构造函数注入和二传手注入之间的区别,包括了春季构造函数注入和二传手注入之间的区别的使用技巧和注意事项,需要的朋友参考一下 依赖注入是一种将依赖对象传递给其他对象的实践。Spring有两种类型的依赖注入: 基于构造函数的Injection -When容器调用类的构造函数。它应用于强制性依赖项。 假设X类紧密依赖于Y类,那么我们应该使用基于构造函数的注入。   基于Setter的注入

  • 问题内容: 我下面有一个简单的课程 我在这里初始化 但是,这导致xcode打印出200 5s,然后由于EXC_BAD_ACCESS code = 2而崩溃。为什么会发生这种情况? 问题答案: @vadian在他的回答中提供了一个解决方案,它可以解决您的问题。让我解释一下发生了什么。 您已经创建了一个计算属性,即一个没有变量支持的属性,取而代之的是,getter和setter方法通常在另一个存储的属

  • 我试图使用数据传输对象pojo将MongoCollection设置为返回/保存,但我不知道如何将pojo编解码器配置为忽略getter/setter。 现在我发现了错误 我不控制数据传输对象,也没有“iLink”属性。(属性只是“link”,对象属性名(已经是“link”)用于系统之间的序列化/反序列化。getILink只是从ILink接口继承的getLink的通用版本) 下面是我构建pojo编解