Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP适当的类通信_Php_Oop_Class_Communication - Fatal编程技术网

PHP OOP适当的类通信

PHP OOP适当的类通信,php,oop,class,communication,Php,Oop,Class,Communication,是否有一种很好的课堂交流方式 例如,我有一个CMS我正在工作。在主类中,它实例化了两个新类:管理器和模块管理器。现在,我需要我的主题管理器能够访问模块管理器,以便它可以读取加载的模块并在页面中打印它们的内容 这样行吗?使这两个类成为主类的公共属性。这使我能够进行双向沟通,在这种情况下我不一定需要这种沟通: class MainClass { public $ThemeManager; public $ModuleManager; .......... func

是否有一种很好的课堂交流方式

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

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

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);
    }
}
注意,无论采用哪种方式,我都必须将这些引用进一步传递给模块类和主题->布局类

也许最好在全局范围内声明管理器和模块管理器,因为它们无论如何只实例化一次,这样就省去了通过每个_构造传递它们的引用的麻烦?我在某个地方读到过,这在OOP中是一种不好的做法,我正试图避免它,但在这种情况下,这似乎是最简单的方法

有没有第四种我没想过的处理沟通的好方法

答复
我最终使用了依赖注入方法,因为它感觉最自然,并且在两个答案中都有建议

你所有的方法听起来都很糟糕。我可以对此进行详细介绍,但我真诚地认为,通过阅读一本关于OOP的书,然后开始使用现代PHP5.3+框架(如ZF2)来了解它是如何实现的,这是最好的

依赖注入,高度模块化,MVC,这一切都在那里供你学习

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

其中应用程序对象协调其余组件。请注意Application::render方法,它可以返回页面生成的整个html

虽然我重复一遍,但我不认为你说的模块或主题是正确的。您应该真正了解一个现代PHP框架PHP5.3+,并了解软件工程师是如何选择设计这些东西的


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

您所要求的是最好的方法

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

但是,不要认为这是未来依赖性问题的“一般答案”。最好的思考方式是每一个案例

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

您可以创建单独的集合方法,而不是在构造函数中传递内容。e、 g.:设置模块管理器。 您还可以使用依赖项注入容器。 当你了解到这一点时,第二个可能看起来很吸引人。这是简单和中心;但我还是会保持警惕。这有点像一把大锤,实际上可能会导致您创建过于紧密的依赖关系。松耦合被认为是一件非常好的事情


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

我明白为什么主题管理器应该“了解”模块管理器了?为什么是另一种方式呢?不应该,我说在这种情况下,单向沟通很好。实际上这三种方法都有效,我只是在寻找一种合适的方法,如果它存在的话。不是答案。如果你有这样的想法,你可以添加一条评论和/或结束对“非建设性”问题的投票。这个问题是关于学习正确的OOP,不是吗?我坦诚且公开地认为我的建议是一个很好的学习方法。任何关于为什么这件事值得投反对票的信息都将受到极大的赞赏。我认为这里有人讨厌依赖注入的想法,doh。有人在没有给出一行评论的情况下继续投反对票。“我觉得这一点帮助都没有。”弗拉维乌斯我想戈列兹特罗尔用他的绰号给了我们一个暗示。