PHP OOP正确的类通信

时间:2012-11-24 17:13:26

标签: php oop class communication

是否有 良好做法 在课堂之间进行交流的方式?

例如,我有一个正在研究的CMS。在 main 类中,它实例化两个新类 ThemeManager ModuleManager 。现在,我需要主题管理器才能访问模块管理器,以便它可以读取已加载的模块并在页面中打印它们的内容。

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

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 类和主题 - > 布局类。

也许最好在全局范围内声明 ThemeManager ModuleManager ,因为它们只会被实例化一次并且省去了通过每个传递它们的引用的麻烦strong> __ 构造 ?我已经读到某个地方,这在OOP中是不好的做法,我试图避免它,但在这种情况下,这似乎是最少的 hacky方式来做它。

有没有第四种处理沟通方式的好方法,我还没有考虑过?

答案

我最终使用Pimple用于依赖注入方法,因为它感觉大多数自然并且在两个答案中都提出了建议。

2 个答案:

答案 0 :(得分:0)

您要求的是dependency injection的最佳方式。

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

但是:不要将此视为未来依赖性问题的“一般答案”。考虑它的最佳方式是每个案例。

另外两种方法:

  1. 您可以创建单独的set方法,而不是在构造函数中传递内容。 (例如:setModuleManager)。
  2. 您还可以使用依赖注入容器。
  3. 当你了解时,第二个看起来很吸引人。它简单而中心;但我仍然会保持警惕。这是一个大锤,实际上可能会导致你创建太紧密的依赖。 (松散耦合被认为是一件非常好的事情)。

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

答案 1 :(得分:-2)

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

依赖注入,高度模块化,MVC,所有这些都可供您学习。

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

enter image description here

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

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

您缺少路由的概念。