2

假设我将代码组织在类中,并且每个类都有自己的文件:

  • main.php,具有Main类
  • config.php具有类Config
  • security.php具有类Security
  • database.php具有类数据库

现在,Main的构造函数将初始化 3 个对象,每个对象一个用于其他类,这样一切看起来或多或少像一个类/子类。问题是现在Security可能需要来自ConfigDatabase的东西(变量或函数)来自 Security 的东西。

// main.php
// here I include the other files
class Main {
    functions __constructor() {
        $this->Config = new Config();
        $this->Security = new Security();
        $this->Database = new Database();
    }
}

// config.php
class Config {
    public $MyPassword = '123456';
    public $LogFile    = 'logs.txt';
    // other variables and functions
}

// security.php
class Security {
    functions __constructor() {
        // NOW, HERE I NEED Config->Password
    }

    function log_error($error) {
        // HERE I NEED Config->LogFile
    }
}

// database.php
class Database {
    functions __constructor() {
        // Trying to connect to the database
        if (failed) {
            // HERE I NEED TO CALL Security->log_error('Connection failed');
        }
    }
}

那么,如何在Main中的这些嵌套类之间共享这些函数和变量?当然,我可以将这些变量作为参数发送给构造函数,但是当我们需要 5 或 10 个变量时会发生什么?我可以将整个对象Config发送到Security并将Security发送到Database

// main.php
// here I include the other files
class Main {
    functions __constructor() {
        $this->Config = new Config();
        $this->Security = new Security($this->Config);
        $this->Database = new Database($this->Security);
    }
}

但这可靠吗?我可以只发送引用(如 C++ 中的指针)吗?也许我可以将孔Main对象的引用作为构造函数中的参数发送,这样就可以使所有内容都可用。

// main.php
// here I include the other files
class Main {
    functions __constructor() {
        $this->Config = new Config();
        $this->Security = new Security(&$this);
        $this->Database = new Database(&$this);
    }
}

我什至不知道这是否可能。你怎么看?有没有更传统的方法?

4

1 回答 1

0

正如评论中所述,您开始考虑与依赖注入一致的术语。您正在防御性地编码(正确地)以解决 SoC(关注点分离)的问题。你可能会像我一样尝试我称之为注册表模式的东西(我对这个主题一无所知,所以我在 windows 注册表之后命名它)。注册表包含所有可能需要传递的对象。这在实际水平上提供了一些好处

  • 如果我不确定其他东西是否需要一个 var,我只需将其添加到注册表中,只要我将注册表传递给他,依赖的人就会知道在哪里查找它
  • 如果我的项目非常小并且我不想为这个想法烦恼太多,那么这是一个简单的解决方案

这种思维模式背后有很多问题。假设项目开始变大,我知道它有时会发生在我身上。现在,像调试这样的简单任务变成了爬山,因为我试图找出为什么依赖项不在我正在寻找的地方,我必须追踪它的设置位置和时间点,以及是否有其他代码改变了它和为什么。

这意味着我们没有遵循 SoC 的原则,而是将关注点传递给现在承担所有责任的第三个对象。这个“注册表”对象现在负责太多事情,发生在它身上的任何更改都会波及你的所有代码。

根据我在 SO 和其他教程中所读到的内容,如果您的对象处理了太多的依赖项(比如说有 10 个参数的构造函数),那么我们可能做得不对。

我希望其他人可以加入,因为我对这个主题非常感兴趣,但我无法将其付诸实践(主要是由于无知)

于 2013-12-17T12:09:15.350 回答