Enums (PHP 8.1)
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 59 de 91.
Antes do PHP 8.1, representar um conjunto fixo de valores, como status ou tipos, significava usar constantes de classe ou strings mágicas — ambas abordagens propensas a erros. Enums (enumerações) fornecem uma maneira adequada de definir um tipo que só pode conter valores específicos e predefinidos.
Defina uma enumeração usando a palavra-chave enum:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Saída:
ActiveEnums também podem ter valores associados — valores de string ou inteiros associados a cada caso. Isso é útil ao armazenar enums em bancos de dados ou APIs:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Saída:
activeEnums com valores associados fornecem um método from() para criar um enum a partir de seu valor, e tryFrom(), que retorna null em vez de lançar um erro para valores inválidos:
<?php
$status = Status::from('active'); // Retorna Status::Active
$invalid = Status::tryFrom('unknown'); // Retorna null
Enums também podem conter métodos, tornando-os poderosos para encapsular lógica relacionada. Eles funcionam perfeitamente com dicas de tipo, garantindo que suas funções aceitem apenas valores válidos — sem precisar verificar se uma string corresponde às opções esperadas.
Desafio
FácilVamos criar um sistema de gerenciamento de pedidos que usa enums para representar os status dos pedidos de forma segura quanto aos tipos. Em vez de depender de strings que podem conter erros de digitação ou ser inválidas, você criará um enum com valores associados que mapeia cada status para um valor adequado ao banco de dados.
Você organizará seu código em três arquivos:
OrderStatus.php: Crie um enum com valores associados do tipo string chamadoOrderStatus, com quatro casos:Pendingassociado a'pending'Processingassociado a'processing'Shippedassociado a'shipped'Deliveredassociado a'delivered'
label()que retorne uma descrição legível para cada status:- Pending retorna
"Awaiting confirmation" - Processing retorna
"Being prepared" - Shipped retorna
"On the way" - Delivered retorna
"Order complete"
Order.php: Crie uma classeOrderque use o enum. Inclua o arquivo OrderStatus. A classe deve:- Aceitar um ID do pedido (string) e um
OrderStatusem seu construtor usando a promoção de propriedades do construtor - Ter um método
getInfo()que retorne"Order [id]: [status label]" - Ter um método
getStatusValue()que retorne o valor associado do status (útil para armazenamento no banco de dados)
- Aceitar um ID do pedido (string) e um
main.php: Inclua o arquivo Order. Você receberá duas entradas: um ID do pedido e uma string de status (como"shipped"). UsetryFrom()para converter com segurança a entrada de string em um enumOrderStatus. Se o status for válido, crie umOrdere imprima duas linhas:- O resultado de
getInfo() - O resultado de
getStatusValue()
"Invalid status".- O resultado de
Este desafio demonstra como os enums fornecem segurança de tipos. Sua classe Order só pode aceitar status válidos, e o método tryFrom() permite lidar com segurança com a entrada do usuário sem correr o risco de usar valores inválidos.
Experimente você mesmo
<?php
require_once 'Order.php';
// Ler entrada
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: Use OrderStatus::tryFrom() para converter com segurança a string de status para um enum
// tryFrom() retorna null se o valor for inválido
// TODO: Se o status for válido, crie um Order e imprima:
// - O resultado de getInfo()
// - O resultado de getStatusValue()
// TODO: If the status is invalid, print "Invalid status"
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online