Чистый статический класс против Singleton

#php #design-patterns

#php #шаблоны проектирования

Вопрос:

Пишу PHP-приложение и имею несколько классов, которые имеют только статические методы (нет необходимости в методах экземпляра). Примером одного из них является NumericValidator , который имеет такие методы, как checkInteger($toCheck) который проверяет, имеет ли передаваемый аргумент тип int, и checkGreaterThan($lOperand, $rOperand) , который проверяет, что левый операнд больше правого операнда и т.д.

Я знаю, что мог просто поместить каждый из этих методов в PHP-файл, не помещая их внутрь класса, но я хочу использовать здесь ООП-подход на случай, если API эволюционирует и потребует создания экземпляра NumericValidator .

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

Например, вот как сейчас выглядит мой код:

 public function doSomething($p_iNum)
{
    if(!NumericValidator::checkInteger($p_iNum))
        // throw IllegalArgumentException

    // ...
}
  

Но я мог превратить все статические методы NumericValidator в нестатические методы экземпляра, заставив программиста создать его экземпляр, а затем реализовать шаблон проектирования singleton, чтобы вы могли ссылаться только на 1 его экземпляр:

 public function doSomething($p_iNum)
{
    NumericValidator $nv = NumericValidator::getInstance();

    if(!nv->checkInteger($p_iNum))
        // throw IllegalArgumentException

    // ...
}
  

Наконец, мой вопрос: что лучше и больше соответствует лучшим практикам? Есть ли соображения по производительности? Как любой из подходов повлияет на такие вещи, как параллелизм или запросы, поступающие от нескольких пользователей?

Комментарии:

1. Зачем вам писать функцию-член объекта-оболочки для is_int?

2. Я использую NumericValidator в качестве примера . И действительно, независимо от того, имеет ли мой пример какой-либо логический смысл или нет, это не имеет никакого отношения к вопросу, который я задаю, который касается различий в производительности между 100% чистыми статическими классами и одиночными.

3. Статика считается вредной

Ответ №1:

Я бы использовал статический класс в вашем примере. Я бы использовал различие в том, существует ли какое-либо состояние свойств экземпляра, которое вы пытаетесь сохранить в access. Это то, для чего предназначен singleton. Статический класс предоставляет организованный доступ к методам в пространстве имен, что полезно для ясности вашего кода, но само по себе не обладает никакими свойствами.

Итак, да, вы можете использовать singleton, но это было бы дурным тоном, потому что нет свойств экземпляра, которые вы хотели бы сделать доступными при доступе к странице.

Надеюсь, это поможет.

Ответ №2:

  1. Используйте Singleton вместо статического класса, только если вы собираетесь передать экземпляр NumericValidator в переменной какой-либо функции.
  2. В PHP 5.3 вы можете получить экземпляр статического класса:

    тест класса { экземпляр публичной статической функции() { print ‘zz’; } }

    $z = новый тест; $z->instance();

  3. Не заботьтесь о запросах параллелизма в PHP, это однопоточный, каждый процесс выполняет собственный код.

Комментарии:

1. Я бы не стал использовать пункт 1 в качестве причины для использования синглтона. Смысл синглтона заключается в сохранении доступа к свойствам экземпляра, который является общим. Не о том, собираетесь ли вы передавать ссылку на него другой функции.

2. Я говорю о различиях между singleton и статическим классом, а не только singleton.

3. Ну, вы начали с вопроса «Использовать …», так что это моя точка отсчета. Разница между ними заключается в том, что традиционно статический класс не мог быть создан, но PHP 5.3 полностью отрицает это.

4. @Wes Я добавил «вместо статического класса» в ответ, спасибо.