Menu
Coddy logo textTech

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:

Active

Enums 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:

active

Enums 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.

challenge icon

Desafio

Fácil

Vamos 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 chamado OrderStatus, com quatro casos:
    • Pending associado a 'pending'
    • Processing associado a 'processing'
    • Shipped associado a 'shipped'
    • Delivered associado a 'delivered'
    Adicione um método 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 classe Order que use o enum. Inclua o arquivo OrderStatus. A classe deve:
    • Aceitar um ID do pedido (string) e um OrderStatus em 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)
  • main.php: Inclua o arquivo Order. Você receberá duas entradas: um ID do pedido e uma string de status (como "shipped"). Use tryFrom() para converter com segurança a entrada de string em um enum OrderStatus. Se o status for válido, crie um Order e imprima duas linhas:
    • O resultado de getInfo()
    • O resultado de getStatusValue()
    Se a string de status for inválida, imprima "Invalid status".

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"

?>
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de PHP online