PHP 单例类的最佳实践

2022-08-30 17:32:55

可能重复:
谁需要单例?

我总是写关于最佳实践的文章,但我也想了解为什么给定的东西是最佳实践

我在一篇文章中继续读到(不幸的是我不记得了),单例类更喜欢实例化,而不是使用静态函数制作并使用范围解析运算符(::)访问。因此,如果我有一个类,其中包含我所有要验证的工具,简而言之:

class validate {
    private function __construct(){}
    public static function email($input){
        return true;
    }
}

我被告知这被认为是不好的做法(或者至少被警告过),因为垃圾收集器和维护之类的东西。因此,对“单例类作为静态方法”的批评想要的是,我实例化了一个我100%确定我只会实例化的类。对我来说,这似乎是在做“双重工作”,因为它已经在那里准备好了。我错过了什么?

对此事有何看法?当然,这不是一个生死攸关的问题,但如果有选择的话,人们不妨以正确的方式做一件事:)


答案 2

单例对象是仅实例化一次的对象。这与单例模式不同,辛格尔顿模式是一种(反)模式,如何编写一个只能实例化一次的类,单例(开头的大S):

“确保一个类只有一个实例,并提供对它的全局访问点。

就 PHP 而言,您通常不需要实现单例模式。事实上,当你要求最佳实践时,你应该避免这样做,因为这是不好的做法

此外,你找到的大多数PHP代码示例都是模式的半就绪实现,忽略了PHP的工作方式。这些虚假的实现不符合模式中的“确保”。

这也说明了一些事情:通常不需要它。如果一个草率的实现已经完成了工作,甚至没有接近模式的用途,那么错误模式已经用于这种情况,它开始成为反模式

在PHP中,通常不需要不惜一切代价确保一个类只有一个实例,PHP应用程序并不像你需要的那么复杂(例如,没有多个线程可能需要引用原子实例)。

通常剩下的是类实例的全局访问点,这是大多数PHP开发人员(错误)使用模式的原因。正如今天所知,使用这样的“单例”会导致全局静态的标准问题,这些问题会跨多个级别的代码引入复杂性并降低可重用性。作为一名程序员,你失去了以灵活的方式使用代码的能力。但灵活性是解决问题的一项非常重要的技术。程序员整天都在解决问题。

因此,在应用设计模式之前,需要评估利弊。只是经常使用某种模式是没有帮助的。

对于初学者,我想说的是,只需编写你的类,并注意它们如何以及何时在应用程序逻辑的其他部分中实例化,以便保持灵活性。


推荐