【问题标题】:PHP OOP proper class communicationPHP OOP 正确的类通信
【发布时间】:2012-11-24 17:13:25
【问题描述】:

有没有一种良好做法在类之间进行交流的方法?

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

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

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

也许在全局范围内声明 ThemeManagerModuleManager 会更好,因为无论如何它们只会被实例化一次,这样我就省去了将它们的引用传递给每个 __构造 ?我在某处读到这在 OOP 中是不好的做法,我试图避免它,但在这样的情况下,这似乎是 最不 hacky 的方法。

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

回答

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

【问题讨论】:

  • 我明白了为什么主题管理器应该“了解”模块管理器?为什么反过来呢?
  • 不应该,我说单向通信在这种情况下工作得很好。实际上所有 3 种方式 work ,我只是在寻找 proper 如果存在的话。

标签: php oop class communication


【解决方案1】:

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

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

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

另外两种方法:

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

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

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

【讨论】:

  • 任何关于为什么这值得一票否决的消息将不胜感激。
  • 我认为这里有人讨厌依赖注入的想法,doh。
  • 有人在不提供 1 行评论的情况下一直对答案投反对票。我觉得一点用都没有。
  • @Flavius 我猜 GolezTroll 用他的昵称暗示了我们。
【解决方案2】:

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

依赖注入,高度模块化,MVC,你可以从中学习。

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

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

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

您缺少例如 路由 的概念。

【讨论】:

  • 不是答案。如果您有这种感觉,您可以添加评论和/或对问题“不具建设性”进行近距离投票。
  • 问题是关于学习正确的OOP,不是吗?我真诚而公开地认为我的建议是一种很好的学习方法。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多