Являются ли PHP одноэлементные классы каким-то образом разделены между запросами?

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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