让我们假设我的代码在类中组织,每个类都有自己的文件:
现在, Main 的构造函数将初始化3个对象,每个对应一个其他类,这样一切看起来或多或少就像一个类/子类。问题是,现在安全性可能需要来自配置和数据库的某些内容(变量或功能)来自安全。
// 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个变量时会发生什么?我可以将整个对象配置发送到安全,安全发送到数据库,
// 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);
}
}
我甚至不知道这是否可行。 你怎么看?还有更传统的方法吗?
答案 0 :(得分:0)
正如评论中所述,您开始考虑使用依赖注入的术语。您正在进行防御性编码(并且正确地)以解决SoC(关注点分离)问题。您可能会尝试使用我称之为“注册表”模式的内容(我对该主题一无所知,因此我在Windows注册表之后将其命名)。注册表包含可能需要传递的所有对象。这在实际水平上提供了一些好处
这种思维方式背后有很多问题。说项目开始变大,我知道有时会发生在我身上。现在像调试这样的简单任务变成了登山,因为我试图找到为什么不依赖于我正在寻找它的地方而且我必须追踪它的设置位置以及在什么时候,如果其他一些代码改变它并且这是为什么。
所有这些意味着我们不是遵循SoC的原则,而是将关注转移到现在承担所有责任的第三个对象上。这个“注册表”对象现在负责太多的事情,发生的任何变化都会影响你的所有代码。
从我读过的SO和其他教程中,如果你的对象有太多依赖性(让我们说构造函数有10个参数)那么我们可能做得不对。
我希望其他人可以参与其中,因为我对这个问题非常感兴趣,但我无法将其付诸实践(主要是因为无知)