Php: singleton VS полный статический класс? Когда используете что?

Я понимаю, что singleton применяет класс, который будет создан один раз. Но почему экземпляр существует, если я не получаю его напрямую? Почему этот шаблон для, не проще ли просто использовать полный статический класс со статическими методами и данными?

Некоторое время назад меня спрашивали, в чем преимущество использования singleton над использованием статического класса, вот мой ответ:

  • Статический класс приводит к невидимым зависимостям – классу, который использует статический класс, но этот класс не является частью интерфейса класса. Singleton также позволяет это, поскольку он обеспечивает глобальную точку доступа, но его экземпляр можно передать как аргумент классу / методу
  • Если есть какая-либо инициализация, как метод connect, она должна вызываться из каждого метода класса, что приводит к дублированию кода. С другой стороны, инициализация singleton выполняется в конструкторе, который называется только один раз из метода getInstance ()
  • Singleton можно легко реорганизовать на фабрике, добавив параметр в метод getInstance () и вернув разные экземпляры
  • Статический класс сложнее расширить, потому что если мы хотим переопределить метод, который вызывается внутри класса с помощью self :: methodName (), мы также должны переопределить вызывающего (хотя в PHP 5.3 существует поздняя статическая привязка, которая могут использоваться, чтобы избежать этих проблем)
  • Если вам нужно добавить аргумент, необходимый для всех методов, вы можете легко сделать это в singleton из-за единственной точки доступа, но вы не можете в статическом классе

Основное различие между статическим классом и синглетом заключается в том, что со статическим классом вам нужно жестко указывать имя класса в коде везде, где вы его используете:

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(); 

Другое важное отличие состоит в том, что одноэлементные классы могут быть частью иерархии и могут реализовывать интерфейсы.

Это не означает, что Синглтон (шаблон) хорош и должен использоваться либерально. Но это лучше, чем использование статического класса напрямую.

[Изменить]: материал, который я написал ниже, на самом деле не прав. Только что получил ответ на этот ответ много лет назад с помощью downvote. Они служат цели;)

Одноэлемент существует один раз, но он может иметь внутреннее состояние – в противоположность статическому классу. Например, вы можете использовать его как глобальный реестр, который вы не можете сделать со статическим классом.

[Edit:] Что будет дальше, тем не менее, так же верно, как и когда-либо.

Это спорно одиночки ли это хорошая идея, хотя. Они вводят глобальное состояние в приложение, которое может очень трудно проверить. Но это еще одна дискуссия.