Traits

Enumerações podem utilizar Traits, que se comportam da mesma maneira que nas classes. A limitação é que usados com use em uma enumeração não podem conter propriedades. Eles podem incluir apenas métodos, métodos estáticos e constantes. Um Trait com propriedades resultará em um erro fatal.

<?php

interface Colorido
{
    public function cor(): string;
}

trait Retangulo
{
    public function forma(): string
    {
        return "Retângulo";
    }
}

enum Naipe implements Colorido
{
    use Retangulo;

    case Copas;
    case Ouros;
    case Paus;
    case Espadas;

    public function cor(): string
    {
        return match ($this) {
            Naipe::Copas, Naipe::Ouros => 'Vermelho',
            Naipe::Paus, Naipe::Espadas => 'Preto',
        };
    }
}

$naipe = Naipe::Espadas;
var_dump($naipe->cor());
var_dump($naipe->forma());
adicionar nota

Notas de Usuários 1 note

up
27
wervin at mail dot com
2 years ago
One good example of a trait, would be to give a lot of enums a method to retrieve their cases, values or both.

<?php
trait EnumToArray
{
    public static function names(): array
    {
        return array_column(self::cases(), 'name');
        
    }

    public static function values(): array
    {
        return array_column(self::cases(), 'value');
    }

    public static function asArray(): array
    {
        if (empty(self::values())) {
            return self::names();
        }
        
        if (empty(self::names())) {
            return self::values();
        }
        
        return array_column(self::cases(), 'value', 'name');
    }
}
?>

Some example outputs:

<?php
var_export(IpVersion::names());     // ['Ipv4', 'IPv6']
var_export(IpVersion::values());    // []
var_export(IpVersion::asArray());   // ['IPv4', 'IPv6']

var_export(Language::names());      // ['en', 'es']
var_export(Language::values());     // ['English', 'Spanish']
var_export(Language::asArray());    // ['en' => 'English', 'es' => 'Spanish']
To Top