【发布时间】:2012-11-24 17:13:25
【问题描述】:
有没有一种良好做法在类之间进行交流的方法?
例如,我正在开发一个 CMS。在 main 类中,它实例化了两个新类 ThemeManager 和 ModuleManager。现在,我需要我的 主题管理器 能够访问 模块管理器,以便它可以读取加载的模块并在页面中打印它们的内容。
这样 OK 吗?使这两个类成为 main 类的公共属性。这使我能够进行双向通信(在这种情况下我不一定需要):
class MainClass {
public $ThemeManager;
public $ModuleManager;
..........
function instantiate_managers() {
$this->ThemeManager = new ThemeManager($this);
$this->ModuleManager = new ModuleManager($this);
}
}
还是这样更好?将一个已经实例化的对象传递给另一个对象,因为单向通信会OK达到我的目的:
class MainClass {
private $ThemeManager;
private $ModuleManager;
..........
function instantiate_managers() {
$this->ModuleManager = new ModuleManager();
$this->ThemeManager = new ThemeManager($this->ModuleManager);
}
}
请注意,无论哪种方式,我都必须将这些引用进一步传递给 Module 类和 Theme -> Layout 类。
也许在全局范围内声明 ThemeManager 和 ModuleManager 会更好,因为无论如何它们只会被实例化一次,这样我就省去了将它们的引用传递给每个 __构造 ?我在某处读到这在 OOP 中是不好的做法,我试图避免它,但在这样的情况下,这似乎是 最不 hacky 的方法。
有没有第 4 种处理沟通的好方法,但我还没有考虑过?
回答
我最终将Pimple 用于依赖注入方法,因为它感觉最自然并且在两个答案中都被建议。
【问题讨论】:
-
我明白了为什么主题管理器应该“了解”模块管理器?为什么反过来呢?
-
不应该,我说单向通信在这种情况下工作得很好。实际上所有 3 种方式 work ,我只是在寻找 proper 如果存在的话。
标签: php oop class communication