Can PHP Enums Have Methods?

Specifying a custom static or non-static method on a PHP enum

PHP enums (both pure enums and backed enums) can have:

enum methods (static or non-static) can be marked as public, private or protected. However, since inheritance is not allowed in enumerations, private and protected are equivalent.

static Methods

It is possible to add static methods to enumerations. For example, they can serve as an alternative to constructors:

// PHP 8.1+
enum Size {
    case Small;
    case Medium;
    case Large;

    public static function fromLength(int $cm) {
        return match(true) {
            $cm < 50 => Size::Small,
            $cm < 100 => Size::Medium,
            default => Size::Large,
        };
    }
}

var_dump(Size::fromLength(75)); // enum(Size::Medium)

You may also use it for utility, for example, like so:

// PHP 8.1+
enum MyEnum: string
{
    case Foo = 'foo';
    case Bar = 'bar';
    case Baz = 'baz';

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

var_dump(MyEnum::getAllValues()); // ['foo', 'bar', 'baz']

Non-Static Methods

It is possible to add non-static methods to enumerations. They can be arbitrarily complex, or as simple as returning a static value. They are accessible on cases (as each enum case itself is a singleton object). The "$this" variable inside a non-static method refers to the case instance. For example, you can use $this with match to provide different results for different cases:

// PHP 8.1+
enum PlayingCards {
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;

    public function getColor(): string
    {
        return match($this) {
            PlayingCards::Hearts, PlayingCards::Diamonds => 'Red',
            PlayingCards::Clubs, PlayingCards::Spades => 'Black',
        };
    }
}

echo PlayingCards::Hearts->getColor(); // 'Red'
echo PlayingCards::Clubs->getColor(); // 'Black'

Hope you found this post useful. It was published . Please show your love and support by sharing this post.