有没有一种很好的实践方式来进行班级之间的交流?
例如,我正在开发一个 CMS。在主类中,它实例化了两个新类ThemeManager和ModuleManager。现在,我需要我的主题管理器能够访问模块管理器,以便它可以读取加载的模块并在页面中打印它们的内容。
这行吗?使这两个类成为主类的公共属性。这使我能够进行双向通信(在这种情况下我不一定需要):
class MainClass {
public $ThemeManager;
public $ModuleManager;
..........
function instantiate_managers() {
$this->ThemeManager = new ThemeManager($this);
$this->ModuleManager = new ModuleManager($this);
}
}
还是这样更好?将已经实例化的一个传递给另一个,因为单向通信可以满足我的目的:
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 中是不好的做法,我试图避免它,但在这样的情况下,这似乎是最简单的方法。
有没有第 4 种好方法来处理我没有考虑过的沟通?
回答
我最终使用Pimple进行依赖注入方法,因为它感觉最自然,并且在两个答案中都被建议。