可能重复:
Who needs singletons?
我总是写最佳实践,但我也想了解为什么给定的东西是最佳实践。
我在一篇文章中读过(遗憾的是我不记得),单例类优先被实例化,而不是使用静态函数创建并使用范围解析运算符(::)进行访问。因此,如果我有一个包含所有要验证的工具的类,简而言之:
class validate {
private function __construct(){}
public static function email($input){
return true;
}
}
我被告知这被认为是不良做法(或者至少被警告过),因为垃圾收集器和维护等等。所以对“单体类作为静态方法”的批评是什么,我实例化一个类我100%肯定我只会实例化一次。对我来说,它似乎在做“双重工作”,因为它已经准备好了。我错过了什么?
对此事有何看法?当然,这不是生死攸关的问题,但如果有选择的话,人们可能会以正确的方式做事:)
答案 0 :(得分:51)
php中的单例类示例:
Creating the Singleton design pattern in PHP5 : Ans 1 :
Creating the Singleton design pattern in PHP5 : Ans 2 :
Singleton is considered "bad practice".
主要是因为:How is testing the registry pattern or singleton hard in PHP?
想读更多? :
单身决策图(source):
答案 1 :(得分:6)
单例对象是仅实例化一次的对象。这与Singleton Pattern不同,{{3}}是一个(反)模式,如何编写一个只能实例化一次的类, Singleton (开头的大 S :
“确保一个类只有一个实例,并提供一个全局访问点。”
就PHP而言,通常不需要实现Singleton模式。事实上,当你要求最佳实践时,你应该避免这样做,因为这是糟糕的做法。
此外,您找到的大多数PHP代码示例都是模式的半实现实现,忽略了PHP的工作方式。这些伪造的实现不符合模式中的“确保”。
这也说明了一些事情:通常不需要它。如果一个草率的实现已经完成了工作,甚至没有接近模式的用途,那么错误的模式已被用于这种情况,它开始成为反模式。
在PHP中,通常不需要不惜一切代价确保一个类只有一个实例,PHP应用程序并不是那么复杂(例如,没有多个线程可能需要引用一个原子实例) )。
通常剩下的是类实例的全局访问点,这是大多数PHP开发人员(错误地)使用该模式的原因。正如今天所知,使用这样的“Singletons”会导致全局静态的标准问题,这会在多个级别上将复杂性引入代码并降低可重用性。作为程序员,您无法灵活地使用代码。但灵活性是解决问题的一项非常重要的技术。程序员整天都在解决问题。
因此,在应用设计模式之前,需要评估优缺点。最常使用某种模式是没有用的。
对于初学者我会说,只需编写你的类并注意如何以及何时在应用程序逻辑的其他部分实例化它们,以便保持灵活性。
答案 2 :(得分:2)
嗯,这实际上不是单身人士;单例确保您只有一个类的单个实例,并且此处没有方法可以检索单个Validate实例。您的设计似乎是静态类。这不会导致垃圾收集器出现问题(至少是你放在这里的代码),因为无论如何都会将其加载到内存中。