strategy patterns examples common php class singleton

patterns - php strategy



¿Las clases de PHP singleton se comparten de alguna manera entre las solicitudes? (4)

Estoy usando el patrón singleton en todos mis archivos de clase PHP.

¿Podría ocasionar que la acción de un usuario en el sitio entre en conflicto con la acción de otro usuario?

Por ejemplo, cuando la aplicación se activa y tenemos varios usuarios en el sitio al mismo tiempo, haciendo cosas similares llamando a las mismas clases PHP (detrás de la escena), ya que singleton previene múltiples instancias de una clase y devuelve solo una instancia .

por ejemplo, tengo una clase llamada Search.php y es una clase singleton. Esta clase maneja todas las consultas de búsqueda del sitio web. Si varios usuarios realizan una búsqueda en el sitio al mismo tiempo, sus acciones entrarán en conflicto entre sí, ya que es una sola instancia de la clase de búsqueda que se puede crear.

Muchas gracias por tu tiempo.


Cada solicitud es independiente y no comparte datos con otras solicitudes (a menos que use extensiones específicas para eso, como Memcache). Por lo tanto, tener singletons en su aplicación no afectaría las solicitudes por separado de los usuarios por separado.

Lo que debería preocuparle es su uso excesivo del patrón singleton. Un singleton es una versión OO de un global, y puede causar algunos errores extraños si no tiene cuidado. Es mejor usar operaciones con ámbito que no dependan de la configuración global, y usar singletons con moderación.


La respuesta corta es no.

Cada solicitud de página se maneja como una instancia única y lo único que las une para cada usuario es la cookie de sesión. Intenta pensar en PHP como una aplicación que comienza cuando llamas a un script y muere cuando termina el script. No mantiene ningún estado y no es intrínsecamente consciente de otras instancias de PHP.

El patrón singleton es simplemente una forma de diseñar una clase, donde puede llamarlo a cualquier lugar de su código (como un global) sin tener que preocuparse de si ya se ha instanciado o no y desea que persista en la memoria.


Estoy de acuerdo, la respuesta es no. Estoy pensando en el patrón Singleton en PHP ahora mismo y he decidido que aunque el patrón Singleton se puede codificar en PHP, en realidad no se implementa porque la instancia no se comparte entre las solicitudes (o se almacena en la memoria de proceso, que es el caso) para entornos de servidores web como ASP.net, Java y Ruby on Rails?) Puede serializar la instancia de Singleton y almacenarla en sesión, pero aún así, no se comparte entre sesiones. Yo especulo que debería ser almacenado en caché para implementar completamente el patrón de Singleton en PHP. Pero aún no lo he hecho, así que no estoy seguro.


El patrón de Singleton es uno de los patrones más controvertidos. Los críticos argumentan que Singleton introduce Global State en una aplicación y combina fuertemente Singleton y sus clases consumidoras. Esto conduce a dependencias ocultas y efectos secundarios inesperados, lo que a su vez conduce a un código que es más difícil de probar y mantener.

Los críticos también argumentan que no tiene sentido utilizar un Singleton en una arquitectura Nothing compartida como PHP, donde los objetos son únicos dentro de la Solicitud solo de todos modos. Es más fácil y más limpio crear gráficos de objetos colaboradores mediante el uso de patrones de Constructores y Fábrica una vez al comienzo de la Solicitud.

Singletons también viola varios de los principios de diseño de OOP "SOLID" y la Ley de Demeter. Los Singletons no pueden ser serializados. No pueden subtipificarse (antes de PHP 5.3) y no serán recopilados como basura porque la instancia se almacena como un atributo estático de Singleton.