1

有没有一种很好的实践方式来进行班级之间的交流?

例如,我正在开发一个 CMS。在类中,它实例化了两个新类ThemeManagerModuleManager。现在,我需要我的主题管理器能够访问模块管理器,以便它可以读取加载的模块并在页面中打印它们的内容。

吗?使这两个类成为类的公共属性。这使我能够进行双向通信(在这种情况下我不一定需要):

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类。

也许在全局范围内声明ThemeManagerModuleManager会更好,因为它们只会被实例化一次,并且省去了通过每个__构造传递它们的引用的麻烦?我在某处读到这在 OOP 中是不好的做法,我试图避免它,但在这样的情况下,这似乎是简单的方法。

有没有第 4 种好方法来处理我没有考虑过的沟通?

回答

我最终使用Pimple进行依赖注入方法,因为它感觉最自然,并且在两个答案中都被建议。

4

2 回答 2

0

您要求的是进行依赖注入的最佳方法。

有很多方法可以解决它,但在您的具体情况下,我会说:选择选项#2。由于您的主题需要了解模块,而不是相反,这将以最简单的方式解决您的问题。

但是:不要认为这是未来依赖问题的“一般答案”。考虑它的最佳方式是单独处理每个案例。

还有两种方法可以做到这一点:

  1. 您可以创建单独的 set 方法,而不是在构造函数中传递东西。(例如:)setModuleManager
  2. 您还可以使用依赖注入容器。

当您了解时,第二个可能看起来很有吸引力。它简单而集中;但我仍然会保持警惕。这有点像大锤,实际上可能会导致您创建过于紧密的依赖关系。(松耦合被认为是一件非常好的事情)。

setter 方法或构造函数参数迫使你非常明确,我觉得这是学习这些东西的最好方法。

于 2012-11-24T17:44:32.860 回答
-2

你所有的方法听起来都很糟糕。我可以详细说明这一点,但老实说,我认为你最好通过阅读一本关于 OOP 的书来学习,然后开始使用像 ZF2 这样的现代 PHP(5.3+)框架,以了解它是如何完成的。

依赖注入、高度模块化、MVC,都在里面供你学习。

但是,在您最初设计的限制范围内,我会这样做:

在此处输入图像描述

一个Application对象协调其余组件的位置。请注意Application::render()可以返回页面生成的整个 html 的方法。

尽管我重复一遍,但当您说“模块”或“主题”时,我认为您的意思并不正确。你真的应该看看现代 PHP 框架(PHP 5.3+),看看软件工程师是如何选择设计这些东西的。

例如,您缺少路由的概念。

于 2012-11-24T17:30:06.880 回答