я работаю над веб-приложением на PHP, которое требует от пользователей регистрации и входа в систему со своими учетными данными. Тем не менее, я использую singleton шаблон во всех моих файлах PHP-файлов.
У меня что-то беспокоит мой разум, который я хотел бы уточнить. Например, когда приложение запускается в прямом эфире, и одновременно у нас есть несколько пользователей на сайте, мы делаем похожие действия, называя те же классы php (за сценой). Теперь, поскольку singleton предотвращает множественный экземпляр класса и возвращает только один экземпляр. Не случайно ли это приведет к тому, что действие пользователя на сайте будет конфликтовано с действиями другого пользователя.
например, у меня есть класс под названием Search.php, и это одноэлементный класс. Этот класс обрабатывает все поисковые запросы с веб-сайта. Если несколько пользователей выполняют поиск на сайте в одно и то же время, будут ли их действия конфликтующими друг с другом, поскольку это всего лишь один экземпляр класса поиска, который может быть создан.
Большое спасибо за ваше время.
Короткий ответ: нет.
Каждый запрос страницы обрабатывается как уникальный экземпляр, и единственное, что связывает их вместе для каждого пользователя, – это cookie сеанса. Попытайтесь придумать PHP как приложение, которое начинается, когда вы вызываете скрипт и умираете, когда скрипт заканчивается. Он не поддерживает какое-либо состояние и не знает о каких-либо других экземплярах PHP.
Шаблон singleton – это просто способ создать класс, где вы можете называть его в любом месте своего кода (например, глобальном), не заботясь о том, было ли оно уже создано или нет, и вы хотите, чтобы он сохранялся в памяти.
Каждый запрос является автономным и не передает данные другим запросам (если вы не используете для этого определенные расширения, например memcache). Таким образом, наличие синглтонов в вашем приложении не повлияет на отдельные запросы от отдельных пользователей.
Что должно вас беспокоить, так это чрезмерное использование одноэлементного шаблона. Синглтон – это версия OO глобальной сети и может вызвать некоторые странные ошибки, если вы не будете осторожны. Лучше использовать операции с областью действия, которые не зависят от глобальных настроек, и экономно использовать синглтоны.
Шаблон Singleton является одним из наиболее противоречивых моделей. Критики утверждают, что Синглтоны вводят Глобальное государство в приложение и тесно связаны с Синглтоном и его потребляющими классами. Это приводит к скрытым зависимостям и неожиданным побочным эффектам, что, в свою очередь, приводит к более сложному тестированию и сохранению кода.
Критики далее утверждают, что бессмысленно использовать Singleton в архитектуре Shared Nothing, как PHP, где объекты уникальны в запросе только в любом случае. Легче и чище создавать диаграммы объектов-соавторов, используя шаблоны Builders и Factory один раз в начале запроса.
Синглтоны также нарушают несколько принципов дизайна «СОЛИД» ООП и Закона Деметры. Синглтоны не могут быть сериализованы. Они не могут быть подтипами (до PHP 5.3) и не будут собираться мусором из-за того, что экземпляр хранится как статический атрибут Singleton.
Я согласен, ответ – нет. Я сейчас думаю о шаблоне Singleton в PHP и решил, что хотя шаблон Singleton может быть закодирован в PHP, он на самом деле не реализован, поскольку экземпляр не используется совместно с запросами (или хранится в памяти процесса, которая имеет место для веб-серверных сред, таких как ASP.net, Java и Ruby on Rails?). Вы можете сериализовать экземпляр Singleton и хранить его в сеансе, но тем не менее, он не используется в сеансах. Я предполагаю, что его нужно будет хранить в кеше, чтобы полностью реализовать шаблон Singleton в PHP. Но я еще этого не сделал, поэтому я не уверен.