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


PHP Front Controller implementation without singleton : conceptual question

我有一个关于php前端控制器实现的"概念性"问题。

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

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

$fc = FrontController::getInstance();

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

$fc = Container->getFrontController();

这段代码对我来说看起来干净多了,我可以得到干净的子类,而不需要关心父构造函数。

这在"引导"时间是完全相同的事情,但在实践中,与我以前的实现的不同之处在于,现在我可以在应用程序的任何地方创建FrontControllers(在DAO内或在Action内),因为构造函数不再是私有/受保护的。

问题是:这是一个"坏做法"给我的类的用户在应用程序的任何地方创建FrontController实例的可能性?我会编写文档并将容器与其他类一起交付,但我仍然想知道我是否应该防止奇怪的使用。

是否有任何真正的理由在应用程序中创建FrontController实例?如果有,那就去吧。否则,我对此有点怀疑,因为它可能会使以后的事情复杂化。我担心的是有人在有更简单的方法时使用新的FrontController实例,要么是出于懒惰,要么是因为他们不知道更好的方法。有些人一旦找到了有效的方法,即使有更好的方法,他们也会继续做下去。永远不要忘记,你可能不得不和不如你的人一起工作。

我个人会隐藏这个或不允许它。但是,我会在以后的版本中记住它。如果你偶然发现它是最好的选择,那就把它添加到你的"官方"界面中。

不要忘记,一旦您将一个函数释放到外部环境中,要杀死它是极其困难的。

$fc = Container::getFrontController();

听起来不错。

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