Constantes en clases
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 16 de 91.
A veces necesitas valores en una clase que nunca deberían cambiar. Las constantes de clase proporcionan una forma de definir valores fijos que permanecen iguales en todas las instancias y no pueden modificarse después de su declaración.
Se define una constante utilizando la palabra clave const dentro de una clase. Por convención, los nombres de las constantes se escriben en mayúsculas:
<?php
class Circle {
const PI = 3.14159;
public $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return self::PI * $this->radius * $this->radius;
}
}
$circle = new Circle(5);
echo $circle->area();
Resultado:
78.53975Al igual que las propiedades estáticas, las constantes pertenecen a la clase en lugar de a los objetos individuales. Se accede a ellas utilizando self::CONSTANT_NAME dentro de la clase o ClassName::CONSTANT_NAME desde fuera:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK . "\n";
echo HttpStatus::NOT_FOUND;
Salida:
200
404Punto clave: A diferencia de las propiedades estáticas, las constantes no se pueden cambiar una vez definidas. Son ideales para valores que deben permanecer fijos en toda la aplicación, como valores de configuración, códigos de estado o constantes matemáticas.
Desafío
FácilVamos a construir una utilidad de conversión de temperatura que utiliza constantes de clase para almacenar valores de conversión fijos que nunca cambian.
Crearás dos archivos para organizar tu código:
Temperature.php— Define una claseTemperatureque maneje las conversiones de temperatura. La clase debe tener tres constantes:FREEZING_POINT_Cestablecida en0,BOILING_POINT_Cestablecida en100, yCONVERSION_FACTORestablecida en1.8(utilizada para la conversión de Celsius a Fahrenheit). Incluye una propiedadpublic $celsiusy un constructor que acepte y establezca el valor Celsius. Añade un métodotoFahrenheit()que convierta la temperatura Celsius almacenada a Fahrenheit utilizando la fórmula:(celsius * CONVERSION_FACTOR) + 32. También añade un métodogetStatus()que devuelva"Freezing"si la temperatura es igual a la constante del punto de congelación,"Boiling"si es igual a la constante del punto de ebullición, o"Normal"en caso contrario.main.php— Incluye el archivo de la clase Temperature. Crea tres objetos Temperature con los valores0,100, y25. Para cada temperatura, imprime la conversión a Fahrenheit seguida del estado en la misma línea con este formato:"[fahrenheit]F - [status]". Cada temperatura debe estar en su propia línea. Después de imprimir las tres, accede a la constanteBOILING_POINT_Cdirectamente desde la clase (usandoTemperature::BOILING_POINT_C) e imprímela en una nueva línea.
Recuerda que se accede a las constantes usando self::CONSTANT_NAME dentro de la clase y ClassName::CONSTANT_NAME desde fuera. A diferencia de las propiedades, las constantes no usan el símbolo $ al acceder a ellas.
Hoja de referencia
Las constantes de clase son valores fijos que nunca cambian y se comparten entre todas las instancias de una clase. Se definen utilizando la palabra clave const:
<?php
class Circle {
const PI = 3.14159;
public function area($radius) {
return self::PI * $radius * $radius;
}
}
Acceda a las constantes utilizando self::CONSTANT_NAME dentro de la clase:
return self::PI * $radius * $radius;
Acceda a las constantes utilizando ClassName::CONSTANT_NAME desde fuera de la clase:
echo Circle::PI;
Diferencias clave con las propiedades estáticas:
- Las constantes no se pueden cambiar después de su declaración
- Las constantes no utilizan el símbolo
$ - Las constantes son ideales para valores fijos como ajustes de configuración, códigos de estado o constantes matemáticas
Por convención, los nombres de las constantes se escriben en mayúsculas:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK; // 200
Pruébalo tú mismo
<?php
require_once 'Temperature.php';
// TODO: Crear tres objetos Temperature con los valores 0, 100 y 25
// TODO: Para cada temperatura, imprimir en el formato: "[fahrenheit]F - [status]"
// Cada temperatura en su propia línea
// TODO: Acceder e imprimir la constante BOILING_POINT_C directamente desde la clase
// Usar la sintaxis ClassName::CONSTANT_NAME
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy