Enums (PHP 8.1)
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 59 de 91.
Antes de PHP 8.1, representar un conjunto fijo de valores, como estados o tipos, significaba usar constantes de clase o cadenas mágicas; ambos enfoques eran propensos a errores. Las enumeraciones (enums) proporcionan una forma adecuada de definir un tipo que solo puede contener valores específicos y predefinidos.
Define una enumeración usando la palabra clave enum:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Salida:
ActiveLos enums también pueden tener valores respaldados: valores de cadena o enteros asociados con cada caso. Esto resulta útil al almacenar enums en bases de datos o API:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Salida:
activeLos enums respaldados proporcionan un método from() para crear un enum a partir de su valor, y tryFrom(), que devuelve null en lugar de generar un error para valores no válidos:
<?php
$status = Status::from('active'); // Devuelve Status::Active
$invalid = Status::tryFrom('unknown'); // Devuelve null
Las enumeraciones también pueden contener métodos, lo que las hace potentes para encapsular lógica relacionada. Funcionan perfectamente con las sugerencias de tipos, asegurando que tus funciones solo acepten valores válidos, sin tener que comprobar si una cadena coincide con las opciones esperadas.
Desafío
FácilConstruyamos un sistema de gestión de pedidos que use enumeraciones para representar los estados de los pedidos de forma segura en cuanto a tipos. En lugar de depender de cadenas que podrían contener errores tipográficos o ser inválidas, crearás una enumeración respaldada que asigna cada estado a un valor adecuado para la base de datos.
Organizarás tu código en tres archivos:
OrderStatus.php: Crea una enumeración respaldada por cadenas llamadaOrderStatuscon cuatro casos:Pendingrespaldado por'pending'Processingrespaldado por'processing'Shippedrespaldado por'shipped'Deliveredrespaldado por'delivered'
label()que devuelva una descripción legible para cada estado:- Pending devuelve
"Awaiting confirmation" - Processing devuelve
"Being prepared" - Shipped devuelve
"On the way" - Delivered devuelve
"Order complete"
Order.php: Crea una claseOrderque use la enumeración. Incluye el archivo OrderStatus. La clase debe:- Aceptar un ID de pedido (cadena) y un
OrderStatusen su constructor mediante la promoción del constructor - Tener un método
getInfo()que devuelva"Order [id]: [status label]" - Tener un método
getStatusValue()que devuelva el valor respaldado del estado (útil para almacenarlo en la base de datos)
- Aceptar un ID de pedido (cadena) y un
main.php: Incluye el archivo Order. Recibirás dos entradas: un ID de pedido y una cadena de estado (como"shipped"). UsatryFrom()para convertir de forma segura la entrada de cadena en una enumeraciónOrderStatus. Si el estado es válido, crea unOrdere imprime dos líneas:- El resultado de
getInfo() - El resultado de
getStatusValue()
"Invalid status".- El resultado de
Este desafío demuestra cómo las enumeraciones proporcionan seguridad de tipos. Tu clase Order solo puede aceptar estados válidos, y el método tryFrom() te permite gestionar de forma segura la entrada del usuario sin arriesgarte a obtener valores no válidos.
Pruébalo tú mismo
<?php
require_once 'Order.php';
// Leer entrada
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: Usa OrderStatus::tryFrom() para convertir de forma segura la cadena de estado a un enum
// tryFrom() devuelve null si el valor es inválido
// TODO: Si el estado es válido, crea un Order e imprime:
// - El resultado de getInfo()
// - El resultado de getStatusValue()
// TODO: If the status is invalid, print "Invalid status"
?>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