Singleton PHP - обработчик базы данных - PullRequest
8 голосов
/ 19 июля 2010

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

Я изо всех сил пытаюсь найти лучшее решение для такой проблемы - т.е. только один обработчик может быть инициализирован за раз -почему картина такая плохая?Это злоупотребление или это просто фундаментальный недостаток?

Php - это язык, который я использую.

Ответы [ 5 ]

8 голосов
/ 19 июля 2010

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

В PHP есть глобальные переменные.Глобальные переменные в PHP обычно являются плохой практикой, но они существуют, если вам нужно их использовать.

Однако есть несколько причин, по которым вы хотите использовать Singleton в PHP.

Синглтоныполезно, когда вызов getInstance (каноническое имя для метода, возвращающего единственный экземпляр Singleton) может быть сделан в любой точке сценария.До этого момента объект не должен существовать.Если бы объект был глобальной переменной, то он либо должен был бы существовать, либо код, пытающийся ссылаться на объект, сначала должен был бы создать его экземпляр.Фактически, где бы он ни использовался, его нужно было бы правильно создать.Централизовав создание отдельного объекта в getInstance, вы избавляетесь от необходимости создавать шаблон-копию для копирования и вставки каждый раз, когда вам нужно обратиться к объекту.

Объекты базы данных обычно создаютсяв самом начале срока действия запроса, так что конкретное преимущество Singleton-ness будет потрачено впустую.

Существуют и другие альтернативы Singleton, которые могут выполнить работу другими способами.Одним из примеров является внедрение зависимости , причудливый термин для передачи внешних объектов, от которых будет зависеть новый объект (например, дескриптор базы данных), во время создания.Однако это может быть сложным или раздражающим.Правильное выполнение может включать внедрение лота одних и тех же объектов каждый раз.

Другой альтернативой является шаблон реестра , который фактически является контейнером для вещей, которые могли быиначе будьте глобальными.Если вам не нравятся глобальные переменные, но вы не против их эффективного пространства имен, это будет решение, которое вам понравится.

В конце выберите один из способов сделать это и придерживайтесьэто один путь по всей вашей кодовой базе.Лично я фанат того, что объект базы данных является глобальным.

2 голосов
/ 19 июля 2010

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

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

0 голосов
/ 19 июля 2010

Помимо глобальных переменных, сообществу не нравятся Singletons, потому что в конце концов есть шанс, что вам понадобится дополнительный экземпляр класса.Например, вы можете использовать Singleton для подключения к базе данных, и он прекрасно работает до того момента, когда вы захотите подключиться к 2 базам данных как один раз.В этот момент вы либо реорганизуете все свое приложение, либо копируете и вставляете синглтон в новый класс и используете его.В любом случае, вы находитесь в определенном ручье без весла.

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

0 голосов
/ 19 июля 2010

Я использую обработчик единой базы данных для большинства моих небольших веб-приложений. В сочетании с внешним файлом конфигурации и PDO в качестве метода доступа к базе данных он все еще может быть очень гибким при переходе от проекта к проекту, если методы не зависят от модели приложения (т. Е. GetRow или getAll вместо getThing или getBreakfast) , Я просто пытаюсь убедиться, что все мои константы доступа определены отдельно.

Большая часть огорчения для синглетонов происходит в основном от языков, более сложных, чем PHP.

0 голосов
/ 19 июля 2010

В шаблоне Singleton нет ничего плохого, я использую его все время.

Как вы говорите, он идеально подходит для ресурсов, у которых должен быть только один экземпляр, и которые являются глобальными для приложения.

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

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