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 ofrecen una forma de definir valores fijos que permanecen iguales en todas las instancias y no pueden modificarse después de su declaración.
Defines 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();
Salida:
78.53975Al igual que las propiedades estáticas, las constantes pertenecen a la clase en lugar de a objetos individuales. Accedes a ellas usando 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 pueden cambiarse una vez definidas. Son ideales para valores que deberían permanecer fijos durante toda tu aplicación, como valores de configuración, códigos de estado o constantes matemáticas.
Desafío
FácilConstruyamos una utilidad de conversión de temperatura que use 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 gestione las conversiones de temperatura. La clase debe tener tres constantes:FREEZING_POINT_Cestablecida en0,BOILING_POINT_Cestablecida en100yCONVERSION_FACTORestablecida en1.8(usada para la conversión de Celsius a Fahrenheit). Incluye una propiedadpublic $celsiusy un constructor que acepte y establezca el valor en Celsius. Añade un métodotoFahrenheit()que convierta la temperatura en Celsius almacenada a Fahrenheit usando la fórmula:(celsius * CONVERSION_FACTOR) + 32. Añade también 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 cualquier otro caso.main.php: Incluye el archivo de la clase Temperature. Crea tres objetos Temperature con los valores0,100y25. 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 directamente a la constanteBOILING_POINT_Cdesde la clase (usandoTemperature::BOILING_POINT_C) e imprímela en una nueva línea.
Recuerda que las constantes se acceden 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.
Pruébalo tú mismo
<?php
require_once 'Temperature.php';
// TODO: Crea tres objetos Temperature con los valores 0, 100 y 25
// TODO: Para cada temperatura, imprime en el formato: "[fahrenheit]F - [status]"
// Cada temperatura en su propia línea
// TODO: Accede e imprime la constante BOILING_POINT_C directamente desde la clase
// Usa 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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online