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

dee*_*ped 5 php oop singleton static class

我理解singleton强制执行一次类.但是如果我不直接访问它,为什么要存在一个实例呢?为什么这种模式不仅仅是使用静态方法和数据的完全静态类?

Max*_*sky 6

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

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


Jon*_*Jon 5

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

StaticClass::doSomething();
StaticClass::doSomethingElse();
Run Code Online (Sandbox Code Playgroud)

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

$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();
Run Code Online (Sandbox Code Playgroud)

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

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