jueves, 15 de diciembre de 2016

Dilema de las clases estáticas en PHP

En mi búsqueda interminable por conseguir estratégias para abordar problemas cotidianos en la programación, hoy coloco esta idea como propuesta para resolver la ambigüedad de las clases estáticas en PHP.

Un poco de teoría para empezar.

¿Que es una clase estática?

Una clase estática, es una clase declarada como estática, que puede ser accedida o invocada sin la necesidad de tener que instanciar un objeto de la clase.

Y ¿Qué significa esto?. Pues bien, de acuerdo a la teoría si queremos hacer una instancia de la clase que queremos definir como estática pues no nos debe permitir hacer esto.


$miClase = new MiClase (); // Esto debe dar un error
Pero PHP no nos genera error al instanciar esta clase.

Por otro lado podríamos omitir el constructor ( cosa que veo mucho por internet en las definiciones de clases y que me parece una mala práctica, creo que toda clase debe tener su constructor y tener además la inicialización de variables en su interior ), pero PHP por omisión acepta la instanciación de la clase pues asume un constructor en blanco o vacío por omisión ante la ausencia explicita de este. Cosa que no resuelve nuestro dilema.

Otra opción muy viable, que funciona y es efectiva, sería colocar el o los modificadores private o protected al constructor, es decir,


private(protected) function __constructor () {

  // nuestro código de inicialización
}
Pero para que colocar código de inicialización si de igual manera no se puede instanciar y no se ejecutará esa sección de código. Pues bueno es solo un ejemplo capcioso para que se confundan jajajaja. Lo cierto es que si colocamos el constructor en private o protected al intentar instanciarlo PHP nos devolverá un error pues el constructor no tiene la visibilidad requerida para ser ejecutado. Pero adicional a esto, ¡que sentido tiene colocar un constructor en private o protected que no se puede usar!. Mejor obviamos esas líneas de código innecesarias, nuestro código queda mucho más limpio, fácil de leer y menos oportunidad para confundirnos.

Ahora bien, mi propuesta para resolver la ambigüedad de las clases estáticas en PHP es la de definir la clase como "ABSTRACTA" de la siguiente manera:


abstract class MiClase {

  static public $atributo_1 = EL_VALOR_QUE_SE_REQUIERA;

  static public function miFuncion ( mi_lista_de_parametros ) {

    // nuestro código
  }
}
Así, al intentar instanciarla como en el primer cuadro de ejemplo, nos devolverá un error, cosa que debe suceder pues en teoría es una clase "estática" y como dije anteriormente, nuestro código queda mucho más limpio, fácil de leer y menos oportunidad para confundirnos.