Я никогда не использовал OO в прошлом в проектах, так как я делал это проще (фактически используя архаичные вызовы mysql_query и собственную фильтрацию), поэтому я хотел начать новый проект, научившись использовать шаблоны проектирования с моим OO по пути ,
Я искал, чтобы создать сайт микроблогов для пинков, и нашел класс шаблонов дизайна синглтона, который казался полным, и использовать с PDO. Я не мог видеть в нем ничего плохого (кроме того, что не мог получить доступ к двум базам данных, которые я не конечно, мне понадобится для этого проекта).
Скажем, такой проект, или простое программное обеспечение CMS, было бы хорошей идеей? Какие типы шаблонов проектирования / типа базы данных будут использовать «большие парни» для этих вещей, будет ли это слишком ограничительным позже, если бы оно было масштабированным (одновременные соединения / производительность)?
Я также прочитал о фабричном синглетоне, чтобы позже иметь дело с дополнительными подключениями, поскольку в нем проще изменить код. Поможет ли это устранить любые негативные проблемы и сделать его более подходящим шаблоном дизайна для этого?
Цель Singleton – ограничить экземпляры объектов одним и обеспечить глобальный доступ.
Обе вещи вам не нужны или нужны.
Ограничение вашего экземпляра одним экземпляром довольно бессмысленно на PHP, где это ограничение применяется только к экземплярам текущего запроса. Если на ваш сайт для микроблогов одновременно попадают два запроса, каждый запрос по-прежнему будет по одному экземпляру. Если вы хотите убедиться, что есть только экземпляр, просто не создавайте экземпляр второго экземпляра.
Глобальный доступ тоже ничем не нужен, потому что он прерывает инкапсуляцию. Если вам нужен определенный экземпляр внутри ваших объектов, передайте его через инъекцию зависимостей . Это чисто и удобно. Он имеет дополнительное преимущество, позволяя вам легко обмениваться зависимостями с другими реализациями, такими как, например, макеты классов для ваших модульных тестов .
Даже Эрих Гамма , один из изобретателей картины Синглтона, задает этот вопрос в наши дни:
«Я за то, что выбрал Singleton, его использование почти всегда является запахом дизайна»,
Лучше всего избегать синглтонов.
Если я не ошибаюсь, синглтон – это антипаттерн . Но в зависимости от задачи его можно использовать.
Как уже говорилось, синглтон не очень помогает вам в вашем блоге. Просто создайте один экземпляр базы данных и используйте его.
Sidenode, то, что вы видите на PHP, часто являются «поддельными синглонами». Если реализован как простой класс, обычно используется метод ::getInstance()
который реализует обходной путь singleton. Однако существование класса позволяет создавать экземпляры нескольких элементов (новый Singleton () && new Singleton ()). Поэтому я бы рекомендовал процедурный синглтон, который не имеет этой проблемы, а также гораздо приятнее на глазах:
function db() { static $db; if (!isset($db)) { $db = new PDO("sqlite:memory"); } return $db; }
Таким образом, вы можете использовать db()->query("SELECT * FROM blog")
и избегать импорта глобального $ db var.