PHP单例类的最佳做法

可能重复:
谁需要单身?

我总是写最好的做法 ,但我也想明白为什么一个给定的事情是一个最佳实践

我读过一篇文章(不幸的是,我不记得),单例类最好被实例化,而不是用静态函数做的,并用范围parsing运算符(::)访问。 所以如果我有一个包含我所有工具来validation的类,简而言之:

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

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

关于这个问题的看法是什么? 当然,这不是一个生死攸关的问题,但是如果select的话,也可以做正确的事情:)

php中的单例类:
在PHP5中创buildSingletondevise模式:Ans 1:
在PHP5中创buildSingletondevise模式:Ans 2:

Singleton is considered "bad practice".

主要是因为这个: 如何在PHP中testingregistry模式或单例?

  • 为什么单身人士不好?

  • 为什么独生子是邪恶的?

  • 一个好方法:dependency injection

  • 关于可重用性的演示:解耦您的PHP代码以实现可重用性

  • 你需要一个dependency injection容器吗?

  • 静态方法vs单例不select

  • 清洁法典会谈 – “全球国家和单身人士”

  • 控制容器的反转和dependency injection模式

想读更多? :

  • 使用PHP数据库类作为单例有什么缺点?

  • 使用PHP PDO的数据库抽象类devise

  • 单身人士会成为微博网站的一个很好的devise模式吗?

  • 修改一个类来封装而不是inheritance

  • 如何访问另一个类的对象?

  • testing使用单例的代码

一个Singleton决策图( 来源 ):

单身决定图

单例对象是仅实例化一次的对象。 这与Singleton Pattern是不一样的,它是一个(Anti-)Pattern如何编写一个只能实例化一次的类Singleton (开头的大S ):

“确保一个class级只有一个实例,并提供一个全局的访问点。”

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

另外,大多数PHP代码示例都是模式的半准备实现,忽略了PHP的工作原理。 这些虚假实现不符合模式中的“确保”。

这也告诉了一些事情:通常这是不需要的。 如果一个马虎的做法已经做好了,甚至还没有接近这个模式,那么错误的模式已经被用于这种情况,它开始变成一个反模式

在PHP中,通常不需要确保一个类只有一个实例,PHP应用程序并不是那么复杂,你可能需要这样做(例如没有多个线程可能需要引用一个primefaces实例)。

通常剩下的就是类实例的全局访问点,这是大多数PHP开发人员(错误)使用该模式的原因。 正如今天所知,使用这样的“单身人士”会导致全局静态的标准问题,从而在多个层次上将代码复杂化,并降低可重用性。 作为程序员,您无法灵活地使用代码。 但是灵活性是解决问题的一个非常重要的技术。 程序员整天都在解决问题。

因此,在应用devise模式之前,需要评估正反两面。 最经常使用一些模式是没有帮助的。

对于初学者,我会说,只是写你的类,并注意如何和什么时候在你的应用程序逻辑的其他部分实例化,所以事情保持灵活。

那么,这实际上不是一个单身人士; 一个单例可以确保你只有一个类的单个实例,并且这里没有任何方法可以检索到单个的Validate实例。 这里的devise似乎是一个静态类。 这不会导致垃圾收集器(至less是你放在这里的代码)的问题,因为无论如何这都会被加载到内存中。