Desarrollo

Constantes en clases en PHP

Desarrollo PHP

Siguiendo con el tema de programación orientada a objetos, veremos en esta ocasión un sencillo artículo donde hablaremos de las constantes en clases en PHP, que nos puede ayudar a sacar un mejor rendimiento de nuestras clases. Será un artículo sencillo para ver una utilidad siempre interesante.

Constantes de clases

Vimos en anteriores artículos el uso de constantes en PHP a un nivel más general. En dicho artículo establecimos las bases de la definición de constantes y vimos principalmente dos tipos de definiciones. Los valores de esas constantes iban a ser fijos durante toda la ejecución del programa, pudiendo obtener esos valores en cualquier momento.

Ahora, tenemos constantes que podemos definir dentro de las clases. ¿En qué se diferencian de las constantes globales? Realmente debería ser en nada pero, entonces, ¿para qué existen?

Pequeñas diferencias

Como hemos comentado, las constantes globales son eso, globales, y podemos utilizarlas en todo el programa. Una constante definida dentro de una clase es, de manera predeterminada, de tipo public, por lo que a efectos prácticos lo único que cambiaría con las constantes globales es la forma de obtener su valor (bueno, y dependiendo de cuándo se ha definido esa constante).

Pero también podemos definir constantes protected o private para reducir el ámbito de uso de esta constante, si lo deseamos.

Otra pequeña diferencia es que en las clases las constantes se definen siempre con la palabra const seguida del nombre de la constante (por convención, toda en mayúsculas) para, después de un igual, definir la constante.

Ahora bien, la gran diferencia viene en cómo obtenemos el valor de la constante.

Obtener el valor de la constante

Supongamos que tenemos una clase que representa a una estantería donde podemos guardar los libros que tiene, su posición, etc. Pero la estantería tiene un límite y vamos a expresar ese límite en una constante. Podríamos tener un código parecido a esto:

class Estanteria() {
	const MAX_LIBROS = 100;

	public function obtenerCapacidadEstanteria() {
		return self::MAX_LIBROS;
	}
}

// Imprimiría 100
echo obtenerCapacidadEstanteria();

// Imprimiría 100
echo Estanteria::MAX_LIBROS;

Obtener la constante dentro de la clase

Como podemos ver en el código que hemos colocado, tenemos dos formas de obtener el valor de la constante según dónde nos encontremos. Si estamos dentro de la clase, la forma de obtener el valor de la constante es con la palabra reservada self seguida de dos puntos dos veces y el nombre de la constante. Es decir, self::MAX_LIBROS nos devolvería el valor 100, que es el que hemos definido como constante.

Obtener la constante fuera de la clase

Sin embargo, y como la constante es public (recordad que hemos dicho que si no lo indicábamos era pública por defecto), entonces podemos acceder a ella desde fuera. ¿Cómo? En el ejemplo hemos puesto de dos formas. La que ya conocemos sería a través de una función, en este caso obtenerCapacidadEstanteria que, si nos fijamos, nos devuelve el valor de la estantería en una función que utiliza self:: como hemos visto en el paso anterior. En este caso nos daría igual que la constante fuera privada o protegida, pues la obtenemos a través de una función pública.

Pero, siendo pública, podemos obtenerla de la forma que vemos, escribiendo el nombre de la clase, los dos puntos dos veces y el nombre de la constante. Es como el método anterior, pero en esta ocasión como self no puede hacer referencia a sí mismo (en inglés sería como decir “a mí mismo”), es decir, no puede hacer referencia a la clase en la que está, pues utilizamos el mismo método pero escribiendo la clase. Por tanto, Estanteria::MAX_LIBROS nos devolvería también el valor 100.

Resumen

Contamos, pues, con una herramienta más a la que podemos sacar partido en nuestros programas para una mejor estructura. Organizar las constantes en clases correspondientes y saber dónde y cuándo usarlas puede ayudarnos a evitar una definición amplia de constantes sin mucho sentido y sin necesidad de usarlas inicialmente.

Deja una respuesta