Singleton PHP – manejador de base de datos

Últimamente he estado leyendo un poco sobre el patrón de singleton. Cuando se leen los aspectos técnicos, parece ideal para administrar un controlador de base de datos o los “me gusta”. Pero después de leer recursos más amplios, parece que la comunidad de desarrolladores realmente no favorece el patrón.

Estoy luchando por encontrar una mejor solución para este problema, es decir, solo se puede inicializar un solo manejador a la vez, ¿por qué el patrón es tan malo? ¿Se usa en exceso o es simplemente defectuoso?

Php es el lenguaje que estoy usando.

Singletons son variables globales glorificadas . El patrón de diseño se creó para los idiomas en los que las variables globales son difíciles o imposibles, o donde se consideran una mala práctica. (De hecho, la mayoría de los patrones de diseño comunes están diseñados para lenguajes restrictivos. Una gran cantidad de ellos son simplemente innecesarios en otros lenguajes).

PHP tiene variables globales. Las variables globales de PHP son generalmente una mala práctica, pero existen si necesita usarlas.

Sin embargo, hay algunas razones por las que querrías un Singleton en PHP.

Los Singletons son útiles cuando la llamada a getInstance (el nombre canónico para el método que devuelve la instancia única del Singleton) podría realizarse en cualquier punto del script. Hasta ese momento, el objeto no necesita existir. Si el objeto fuera una variable global en su lugar, tendría que existir o el código que intentaba hacer referencia al objeto primero tendría que crear una instancia. De hecho, en cualquier lugar en el que se pueda usar, se debería crear una instancia correcta. Al centralizar la creación del único objeto en getInstance , evita tener que crear repetitivo copiar y pegar cada vez que necesite hacer referencia al objeto.

Los objetos de la base de datos generalmente se crean muy temprano en la vida útil de la solicitud, por lo que ese beneficio específico de Singleton-ness se perdería.

Existen otras alternativas a Singleton que pueden hacer el trabajo de otras maneras. Un ejemplo es la dependency injection , un término sofisticado para pasar objetos externos de los que dependería un nuevo objeto (como un identificador de base de datos) al objeto en el momento de la construcción. Sin embargo, esto puede ser complicado o molesto. Hacerlo bien podría implicar inyectar muchos de los mismos objetos cada vez.

Otra alternativa es el patrón de registro , que es efectivamente un contenedor para cosas que de otra manera serían globales. Si no te gustan las variables globales, pero no te importa que tengan un espacio de nombre eficaz, esta sería una solución que te gustaría.

Al final, elige una forma de hacerlo y apégate de una manera a lo largo de tu base de código. Personalmente, soy un fanático de que la base de datos sea un objeto global.

Algunas personas siguen este mantra de que los Singletons son malos porque son como variables globales y hacen que su código sea más difícil y difícil de probar.

Por mi parte, no creo que sea tan mala idea, y creo que un Singleton funciona bastante bien para un controlador de base de datos. Es fácil, intuitivo y tiene más control sobre una instancia de Singleton que una variable global.

No hay nada malo con el patrón de Singleton, lo uso todo el tiempo.

Como usted dice, es ideal para recursos de los que solo debería tener una instancia y que son globales para la aplicación.

Creo que a algunos desarrolladores no les gusta debido a las dependencias que se pueden crear a través de este método. Lea acerca de la dependency injection, ya que creo que cubre por qué Singletons es malo, pero no puedo recordar exactamente.

Utilizo un controlador de base de datos Singleton para la mayoría de mis aplicaciones web más pequeñas. Cuando se combina con un archivo de configuración externo y un PDO como método de acceso a la base de datos, puede ser muy flexible al pasar de un proyecto a otro, siempre que los métodos no sean específicos del modelo de aplicación (es decir, getRow o getAll en lugar de getThing o getBreakfast) . Solo bash y me aseguro de que todas mis constantes de acceso estén definidas por separado.

Gran parte del disgusto de los singletons se deriva principalmente de lenguajes más complejos que PHP.

Aparte de la variable global, a la comunidad no le gustan los Singletons porque, eventualmente, existe la posibilidad de que necesite una instancia adicional de la clase. Por ejemplo, puede usar un Singleton para su conexión de base de datos y funciona muy bien hasta el momento en que desea conectarse a 2 bases de datos como una sola vez. En ese momento, usted refactoriza su aplicación completa o copia y pega el singleton a una nueva clase y lo utiliza. De cualquier manera, estás en un cierto arroyo sin una paleta.

Sin embargo, el patrón Singleton es un patrón de diseño, no una implementación. Nadie dijo que el código que lo restringe a una instancia tiene que estar dentro de la clase. Descubrí que si crea una instancia de la clase a través de un método de fábrica, puede poner la implementación de singleton en el método de fábrica. Entonces, si un día necesita una nueva instancia, puede agregar un nuevo método de fábrica para hacer eso, ya que la clase en sí no tiene restricciones. El precio para esto, por supuesto, es que siempre crea una instancia de su singleton a través de una fábrica y no directamente.