Лучшая практика по одноэлементным классам PHP

Возможный дубликат:
Кому нужны синглтоны?

Я всегда пишу в отношении лучшей практики, но я также хочу понять, почему данная вещь является лучшей практикой.

Я читал в статье (я, к сожалению, не помню), что классы singleton предпочтительнее создавать, а не создавать статические функции и получать доступ с помощью оператора разрешения области (::). Поэтому, если у меня есть класс, содержащий все мои инструменты для проверки, короче:

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

Мне сказали, что это считается плохой практикой (или, по крайней мере, предостерегаемой), из-за таких вещей, как сборщик мусора и обслуживание. Так что критика "singleton class as static methods" хочет, это то, что я создаю экземпляр класса. Я на 100% уверен, что когда-нибудь создам экземпляр. Мне кажется, что я делаю "двойную работу", потому что там все готово. Что мне не хватает?

Какое мнение по этому вопросу? Конечно, это не проблема жизни и смерти, но, возможно, так же хорошо, если опция есть:)

Ответ 1

Пример однопользовательских классов в php:
Создание шаблона проектирования Singleton в PHP5: Ans 1:
Создание шаблона проектирования Singleton в PHP5: Ans 2:

Singleton is considered "bad practice".

В основном из-за этого: Как протестировать шаблон реестра или singleton hard в PHP?

Хотите узнать больше?

Схема решения Singleton (источник):

Singleton Decision Diagram

Ответ 2

Объект singleton - это объект, который создается только один раз. Это не то же самое, что Singleton Pattern, который является (Anti-) шаблоном, как писать класс, который может быть создан только один раз, Синглтон (большой S в начале):

"Убедитесь, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к нему".

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

Кроме того, большинство примеров кода PHP, которые вы находите, являются полузаготовленными реализациями шаблона, которые пренебрегают тем, как работает PHP. Эти фиктивные реализации не соответствуют требованиям "обеспечить" в шаблоне.

Это также говорит кое-что: часто, что это не нужно. Если неаккуратная реализация делает работу уже пока не приближается к тому, для чего предназначен шаблон, для этой ситуации использовался неправильный шаблон, который стал анти-шаблоном.

В PHP обычно нет необходимости во что бы то ни стало гарантировать, что класс имеет только один экземпляр, PHP-приложения не настолько сложны, что вам нужно это (например, нет нескольких потоков, которые могут потребоваться ссылаться на атомный экземпляр).

То, что часто остается, - это глобальная точка доступа к экземпляру класса, которая для большинства разработчиков PHP (неверно) использует шаблон. Как известно сегодня, использование таких "синглтонов" приводит к стандартным проблемам глобального статического состояния, которые вводят сложность в ваш код на нескольких уровнях и уменьшают повторное использование. Как программист вы теряете способность использовать свой код гибким способом. Но гибкость - очень важный метод решения проблем. И программисты решают проблемы целый день.

Поэтому перед тем, как применить шаблон дизайна, необходимо и нужно про и минусы. Просто использование некоторых шаблонов чаще всего не помогает.

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

Ответ 3

Ну, на самом деле это не синглтон; singleton гарантирует, что у вас есть только один экземпляр класса, и здесь нет метода, который бы извлекал один экземпляр Validate. Ваш дизайн здесь выглядит как статический класс. Это не вызовет проблемы с сборщиком мусора (по крайней мере, код, который вы разместили здесь), потому что это будет загружено в память независимо от того, что.