Home

Awesome

PHP Enum implementation inspired from SplEnum

GitHub Actions Latest Stable Version Total Downloads Psalm Shepherd

Maintenance for this project is supported via Tidelift.

Why?

First, and mainly, SplEnum is not integrated to PHP, you have to install the extension separately.

Using an enum instead of class constants provides the following advantages:

This Enum class is not intended to replace class constants, but only to be used when it makes sense.

Installation

composer require myclabs/php-enum

Declaration

use MyCLabs\Enum\Enum;

/**
 * Action enum
 *
 * @extends Enum<Action::*>
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

Usage

$action = Action::VIEW();

// or with a dynamic key:
$action = Action::$key();
// or with a dynamic value:
$action = Action::from($value);
// or
$action = new Action($value);

As you can see, static methods are automatically implemented to provide quick access to an enum value.

One advantage over using class constants is to be able to use an enum as a parameter type:

function setAction(Action $action) {
    // ...
}

Documentation

Static methods:

Static methods

final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

// Static method:
$action = Action::VIEW();
$action = Action::EDIT();

Static method helpers are implemented using __callStatic().

If you care about IDE autocompletion, you can either implement the static methods yourself:

final class Action extends Enum
{
    private const VIEW = 'view';

    /**
     * @return Action
     */
    public static function VIEW() {
        return new Action(self::VIEW);
    }
}

or you can use phpdoc (this is supported in PhpStorm for example):

/**
 * @method static Action VIEW()
 * @method static Action EDIT()
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

Native enums and migration

Native enum arrived to PHP in version 8.1: https://www.php.net/enumerations
If your project is running PHP 8.1+ or your library has it as a minimum requirement you should use it instead of this library.

When migrating from myclabs/php-enum, the effort should be small if the usage was in the recommended way:

Changes for migration:

/**
 * @method static Action VIEW()
 * @method static Action EDIT()
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

to

enum Action: string
{
    case VIEW = 'view';
    case EDIT = 'edit';
}

All places where the class was used as a type will continue to work.

Usages and the change needed:

Operationmyclabs/php-enumnative enum
Obtain an instance will change from$enumCase = Action::VIEW()$enumCase = Action::VIEW
Create an enum from a backed value$enumCase = new Action('view')$enumCase = Action::from('view')
Get the backed value of the enum instance$enumCase->getValue()$enumCase->value
Compare two enum instances$enumCase1 == $enumCase2 <br/> or <br/> $enumCase1->equals($enumCase2)$enumCase1 === $enumCase2
Get the key/name of the enum instance$enumCase->getKey()$enumCase->name
Get a list of all the possible instances of the enumAction::values()Action::cases()
Get a map of possible instances of the enum mapped by nameAction::values()array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases()) <br/> or <br/> (new ReflectionEnum(Action::class))->getConstants()
Get a list of all possible names of the enumAction::keys()array_map(fn($case) => $case->name, Action::cases())
Get a list of all possible backed values of the enumAction::toArray()array_map(fn($case) => $case->value, Action::cases())
Get a map of possible backed values of the enum mapped by nameAction::toArray()array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases())) <br/> or <br/> array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants()))

Related projects