Являются ли PHP-синглтон-классы каким-то образом разделенными между запросами? - PullRequest
15 голосов
/ 11 января 2009

Я использую шаблон синглтона во всех моих файлах классов PHP.

Может ли это случайно привести к тому, что действие пользователя на сайте вступит в конфликт с действием другого пользователя?

Например, когда приложение запускается и у нас на сайте одновременно несколько пользователей, которые делают схожие вещи, вызывая одни и те же классы PHP (за кулисами), поскольку singleton предотвращает множественный экземпляр класса и возвращает один экземпляр.

например. У меня есть класс с именем Search.php, и это одноэлементный класс. Этот класс обрабатывает все поисковые запросы с сайта. Если несколько пользователей выполняют поиск на сайте одновременно, их действия будут конфликтовать друг с другом, поскольку может быть создан только один экземпляр класса Search.

Большое спасибо за ваше время.

Ответы [ 4 ]

29 голосов
/ 11 января 2009

Короткий ответ - нет.

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

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

28 голосов
/ 11 января 2009

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

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

5 голосов
/ 22 февраля 2012

Шаблон Singleton является одним из наиболее противоречивых шаблонов. Критики утверждают, что Singletons вводят Global State в приложение и тесно связывают Singleton и его потребляющие классы. Это приводит к скрытым зависимостям и неожиданным побочным эффектам, что, в свою очередь, приводит к тому, что код сложнее тестировать и поддерживать.

Критики также утверждают, что бессмысленно использовать Singleton в архитектуре Shared Nothing, такой как PHP, где объекты в любом случае уникальны в Запросе. Создавать графы объектов соавтора проще и проще, используя шаблоны Builders и Factory один раз в начале запроса.

Синглтоны также нарушают некоторые принципы построения ООП "SOLID" и Закон Деметры. Синглтоны не могут быть сериализованы. Они не могут быть подтипированы (до PHP 5.3) и не будут собираться из-за того, что экземпляр хранится как статический атрибут Singleton.

2 голосов
/ 20 марта 2009

Согласен, ответ - нет. Я думаю о паттерне Singleton в PHP прямо сейчас и решил, что хотя паттерн Singleton может быть закодирован в PHP, он на самом деле не реализован, так как экземпляр не распределяется между запросами (или хранится в памяти процесса, что имеет место для сред веб-серверов, таких как ASP.net, Java и Ruby on Rails?) Вы можете сериализовать экземпляр Singleton и сохранить его в сеансе, но, тем не менее, он не распределяется между сеансами. Я предполагаю, что он должен быть сохранен в кеше, чтобы полностью реализовать шаблон Singleton в PHP. Но я этого еще не сделал, поэтому я не уверен.

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