Php:singleton VS全静态类?什么时候用?

时间:2011-07-26 11:54:12

标签: php oop class static singleton

我知道单身人士强制要创建一次类。但是如果我不直接访问它,为什么要存在一个实例呢?为什么这种模式更容易使用静态方法和数据的完整静态类?

3 个答案:

答案 0 :(得分:6)

前段时间我被问到使用单例而不是使用静态类有什么好处,这是我的回答:

  • 静态类导致不可见的依赖 - 这是一个使用静态类的类,但该类不是类'接口的一部分。 Singleton也允许这样做,因为它提供了全局访问点,但它的实例可以作为参数传递给类/方法
  • 如果有任何初始化,作为connect方法,应该从每个类方法调用它,这会导致重复的代码。另一方面,单例的初始化是在构造函数中执行的,从getInstance()只调用一次 方法
  • Singleton可以在工厂中轻松重构,向getInstance()方法添加参数并返回不同的实例
  • 静态类更难扩展,因为如果我们想要覆盖一个方法,即使用self :: methodName()在类中调用,我们也应该覆盖调用者(尽管在PHP 5.3中有一个后期静态绑定,可用于避免这些问题)
  • 如果你需要添加一个所有方法都需要的参数,你可以轻松地在单例中执行此操作,因为单个访问点,但你不能在静态类中

答案 1 :(得分:5)

静态类和单例之间的主要区别在于,对于静态类,您需要在代码中的代码中对类名进行硬编码:

StaticClass::doSomething();
StaticClass::doSomethingElse();

使用单身人士时,您只需要对类名称进行一次硬编码:

$singleton = SingletonClass::getInstance();

// other code does not need to know where $singleton came from,
// or even that class SingletonClass exists at all:
$singleton->doSomething();
$singleton->doSomethingElse();

另一个重要的区别是单例类可以是层次结构的一部分,并且可以实现接口。

这并不意味着Singleton(模式)是好的,应该自由使用。但它比直接使用静态类更好。

答案 2 :(得分:-1)

[编辑]:我在下面写的东西实际上是完全错误的。几年前,通过downvote得到了这个答案的警报。它们确实有用;)

单例存在一次,但它可以具有内部状态 - 而不是静态类。你可以例如将它用作全局注册表,您无法使用静态类。

[编辑:]接下来会发生的事情和过去一样真实。

但是,单身人士是否是一个好主意是值得商榷的。他们将全局状态引入到应用程序中,这使得测试非常困难。但这是另一个讨论。