Logo

dev-resources.site

for different kinds of informations.

Enum ou Enumerations no PHP

Published at
3/5/2023
Categories
php
webdev
php8
enum
Author
marcellorg
Categories
4 categories in total
php
open
webdev
open
php8
open
enum
open
Author
10 person written this
marcellorg
open
Enum ou Enumerations no PHP

Neste artigo, veremos a funcionalidade de Enums no PHP v8.1, o que são casos puros e com suporte em Enums e a diferença entre classes regulares e Enums.

Sintaxe Básica

O PHP 8.1 utiliza a palavra-chave enum para declarar Enums. A sintaxe é semelhante à sintaxe de traits, classes e interfaces. Veja como fica um enum simples:

enum Senioridade {
    case Junior;
    case Pleno;
    case Senior;
    case Especialista;
}
Enter fullscreen mode Exit fullscreen mode

A palavra-chave case é usada para descrever os valores específicos que o Enum aceita. Os casos do Enum são referenciados da mesma forma que as constantes de classe:

$nivel = Senioridade::Especialista;
Enter fullscreen mode Exit fullscreen mode

A vantagem dos enums é que eles abordam uma coleção de valores constantes. Enums agem basicamente da mesma maneira que classes e interfaces. Portanto, é possível fazer uma tipagem de que uma função aceite apenas um valor definido em um enum:

class Programador {

    public function __construct(
        public string $nome,
        public Senioridade $nivel
    ){}
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, você pode passar o Enum Senioridade na classe Programador:

$programador = new Programador("Marcello", Senioridade::Especialista);
Enter fullscreen mode Exit fullscreen mode

Backed enum (definindo valores)

Os valores do Enum são representados internamente por objetos, mas você pode atribuir um valor a eles se quiser; isso é útil, por exemplo, para serializá-los em um banco de dados.

enum Senioridade: int {
    case Junior = 1;
    case Pleno = 2;
    case Senior = 3;
    case Especialista = 4;
}
Enter fullscreen mode Exit fullscreen mode

Aqui, o enum Senioridade foi modificado para criar um enum suportado do tipo int.

Aqui estão algumas regras para Enums suportados:

  • Ele deve declarar o tipo escalar na declaração do Enum. E apenas string ou int são permitidos.
  • Ele deve atribuir um valor para todos os casos.
  • Os valores atribuídos a cada caso devem ser do mesmo tipo escalar.
  • Não deve conter casos ou valores duplicados.

Para obter o valor atribuído, utilize a propriedade ->value:

$programador->nivel->value
Enter fullscreen mode Exit fullscreen mode

Mas, caso precise obter o nome, utilize a propriedade ->name:

$programador->nivel->name
Enter fullscreen mode Exit fullscreen mode

Valor Escalar para Enum

Quando queremos obter de volta o valor escalar para o Enum, podemos utilizar o método from(). Este método recebe o valor de string ou inteiro e o converte de volta para o Enum.

Senioridade::from(3) // Senior
Enter fullscreen mode Exit fullscreen mode

Se um valor for passado que não corresponda aos valores permitidos, haverá um erro fatal.

Senioridade::from(100); // PHP fatal error
Enter fullscreen mode Exit fullscreen mode

O código acima resultará em um erro fatal do PHP, pois o valor "100" não está presente no enum Senioridade.
Para tornar isso mais seguro, o PHP 8.1 nos fornece um método tryFrom() que retornará nulo em vez de lançar um erro.

Senioridade::tryFrom(100) // NULL
Enter fullscreen mode Exit fullscreen mode

Métodos em enums

Enums podem conter métodos. Eles também suportam modificadores de visibilidade de método padrão, bem como métodos estáticos.
Por exemplo, declarando um método label(): string que retorna uma etiqueta amigável para um caso de enumeração.

enum Senioridade: int {
    case Junior = 1;
    case Pleno = 2;
    case Senior = 3;
    case Especialista = 4;

    public function label(): string {
        return match ($this) {
            self::Junior => "Dev Junior",
            self::Pleno => "Dev Pleno",
            self::Senior => "Dev Sênior",
            self::Especialista => "Dev Especialista"
        };
    }
}
Enter fullscreen mode Exit fullscreen mode

Para obter o valor da label, é só chamar o método que criamos label():

$programador = new Programador("Marcello", Senioridade::Especialista);

$programador->nivel->label() // Dev Especialista
Enter fullscreen mode Exit fullscreen mode

Listando valores de enums

Você pode usar o método estático Enum::cases() para obter uma lista de todos os casos disponíveis dentro de um enum. Este método retorna uma matriz contendo os objetos enum reais:

Senioridade::cases()
Enter fullscreen mode Exit fullscreen mode

Considerações finais

Esse é o grosso de um enum, mas existem muitas outras coisas que podem ser exploradas ao usar enums, as quais podem ser conferidas no RFC (Request for Comments).
Aqui está o link da RFC para a leitura completa:
https://wiki.php.net/rfc/enumerations

enum Article's
30 articles in total
Favicon
Mastering ENUMs in Go
Favicon
The 3 kinds of Enum in Rails
Favicon
Enhancing Enum Constants in Laravel with Description and Label Attributes
Favicon
Should I stay or should I go? Enums in TypeScript - error case study
Favicon
Effective Enum
Favicon
Result in Rust: another way of error handling
Favicon
How to convert a TypeScript built-in enum to a GraphQL enum
Favicon
Leveraging Enums in Angular: Enhancing Code Clarity and Reliability
Favicon
Typescript enum vs. "as const"
Favicon
Enum Fábrica Solitão em Java
Favicon
Implementing Enums in Golang
Favicon
Elixirでリストの最初の要素を取得
Favicon
[JS TS] How to create an object with keys based on enum
Favicon
Enum ou Enumerations no PHP
Favicon
Replacing If-Else Statements with Enums in Java
Favicon
Dart enhanced enum with custom values
Favicon
Working with Enums in Rust
Favicon
Modelando algoritmos complexos com enum
Favicon
Managing Task Status Transitions in TypeScript with Enums and Object Mapping
Favicon
TypeScript Enum's vs Discriminated Unions
Favicon
Strategy Pattern no Spring Boot Usando Enum
Favicon
Problem in C Pointer
Favicon
Merge TypeScript Enums
Favicon
Agora sim, o grande ganho do enum no Dart 2.17
Favicon
How to proper use ambient enum from Definition file
Favicon
O Poder da Classe Enum com métodos abstratos
Favicon
Refactoring code with the Strate Pattern
Favicon
🔥Input Enums for a better Development Experience 🔥 😋✂️
Favicon
O pequeno grande ganho do enum no Dart 2.15
Favicon
Typescript enums drawbacks and solutions

Featured ones: