En una clase teórica de acceso a la base de datos, encontré que hay bastantes funciones auxiliares que uso en la clase, que no tienen nada que ver con la instancia de la clase (y otras que podrían manipularse no estar relacionado con la instancia de la clase que usa la inyección de dependencia).Desventajas de los métodos estáticos en PHP
Por ejemplo, tengo una función que obtiene una cadena entre otras dos cadenas en una variable. He estado pensando en mover eso a una clase String_Helper, o algo por el estilo. Esta función ya se ha convertido en estática.
Además, tengo una función que consulta una base de datos, query($sql)
. La instancia proporciona los detalles de la conexión, pero he estado considerando hacerlo estático y usando query($sql, $connection)
. Los desarrolladores podrían llamarlo estáticamente y no necesitar crear una instancia de la clase de la base de datos.
Para mí, las preguntas son:
¿Vale la pena hacer algo como esto? Funciones como la función de consulta me preguntan si esto no es solo yo tratando de hacer que todo sea lo más estático posible, sin ninguna necesidad real. ¿Bajo qué circunstancias considerarías esto útil?
Sé que las funciones estáticas son más difíciles de probar, pero si me aseguro de que su código es completamente libre de dependencia (o usa inyección de dependencia cuando sea necesario), entonces son tan fáciles de probar como todo lo demás, ¿no?
No es una preocupación en este momento, pero si, en el futuro, decidiera extender las clases con las funciones estáticas, me sería imposible hacer que el código actual use mis funciones extendidas. He pensado en Singletons, pero surge el mismo problema: el código llamaría al
Singleton_Class::getInstance()
y no alMy_Extended_Singleton_Class::getInstance()
. La inyección de dependencias parece ser la única forma de resolver este problema, pero podría llevar a una API clunkier, ya que cada dependencia tiene que asignarse a un objeto en__construct()
.Tengo una clase de contenedor, que contiene ciertos datos de forma estática para que se pueda acceder a ellos en cualquier parte del script (alcance global). Si no puedo usar funciones estáticas o singletons, una clase que contenga instancias de diferentes variables sería genial. Uno podría usar, por ejemplo,
Container::$objects['MyClass'] = $MyClass_object;
, y luego el resto del código podría simplemente acceder alContainer::$objects['MyClass']
. Si extendiera la clase MyClass, podría usarContainer::$objects['MyClass'] = $MyExtendedClass_object;
, y el código que usóContainer::$objects['MyClass']
usaría MyExtendedClass, en lugar de MyClass. Esta es, de lejos, la mejor manera de hacerlo, en mi opinión, pero me gustaría saber qué piensas al respecto.
Con estas preguntas, estaba tratando de resolver dos problemas: en primer lugar, si valdría la pena hacer las cosas estáticas y qué problemas/desventajas podrían surgir al hacerlo. En segundo lugar, quería encontrar la forma más sencilla de almacenar un conjunto de instancias de objetos, a la vez que los ponía a disposición cuando era necesario. Tu idea de usar un registro que se inyecte a cualquier función que pueda necesitar dependencias es brillante, ya que significa que la API no se llena de argumentos para todas las dependencias, y todavía tengo una manera de administrar cualquier cantidad de instancias de un objeto. Gracias. :) –
@ Bruno: No hay problema. Es una forma bastante estándar de interactuar con un gran número de objetos. Tiene el beneficio de ser muy comprobable, ya que solo creas un registro lleno de objetos simulados (o solo el que necesita la prueba) e inyectártelo. No hay efectos secundarios globales, por lo que no hay necesidad de preocuparse por romper accidentalmente nada. Buena suerte otra vez ... – ircmaxell