没有单例的PHP前端控制器实现:概念性问题

时间:2011-04-09 14:41:57

标签: php model-view-controller front-controller

我有一个关于前端控制器实现的“概念”问题。

我见过的大多数前控制器是用Singleton实现的,我不是单例模式的忠实粉丝,我创建了一个具有静态属性的Container,它将存储一个前端控制器的单一实例。

使用singleton,我必须将初始化代码放在构造函数(或构造函数调用的方法)中:

$fc = FrontController::getInstance();

使用容器我可以将配置放在FrontController之外,这是我的目标,我仍然有一种简单的方法来检索FrontController。

$fc = Container->getFrontController();

这段代码看起来更干净,我可以得到干净的子类,而不用关心父构造函数。

在'bootstrap'时间这是完全相同的事情,但实际上与我之前的实现不同的是,现在我可以在应用程序的任何地方创建FrontControllers(在DAO内部或Action内部),因为构造函数不再私人/保护。

我的问题是:    给我的类用户提供在应用程序中的任何位置创建FrontController实例的可能性是一种“不好的做法”吗?我会写文档并与其他类交付容器,但我仍然想知道我是否应该防止奇怪的用途。

2 个答案:

答案 0 :(得分:2)

$fc = Container::getFrontController();

听起来不错。

我不认为允许开发人员在任何地方检索Front Controller实例是不好的做法,如果你正确控制开发人员可以用它做什么(例如,不要覆盖某些属性或以错误的顺序执行其方法没有向用户显示错误/警告。)

答案 1 :(得分:2)

是否有任何真正的理由在应用程序内创建FrontController实例?如果有,那么继续。否则我对此有点怀疑,因为它可能会使事情复杂化。我害怕的是有人使用新的FrontController实例,当有一个更简单的方式,或者出于懒惰或者因为他们不知道更好。一旦找到有效的东西,即使有更好的方法,有些人也会继续这样做。永远不要忘记你可能不得不与那些不如你的人一起工作。

就我个人而言,我会隐藏它或完全不允许它。但是我会在以后的版本中记住这一点。如果您偶然发现这是最佳选择,请将其添加到“官方”界面。

不要忘记,一旦你将一个功能释放到野外,就很难将其杀掉。