PHP Enum implementation inspired from SplEnum
[ ][GA Link]
][GA Link]
 
 
 , (*1)
, (*1)
Maintenance for this project is supported via Tidelift., (*2)
Why?
First, and mainly, SplEnum is not integrated to PHP, you have to install the extension separately., (*3)
Using an enum instead of class constants provides the following advantages:, (*4)
- You can use an enum as a parameter type: function setAction(Action $action) {
- You can use an enum as a return type: function getAction() : Action {
- You can enrich the enum with methods (e.g. format,parse, …)
- You can extend the enum to add new values (make your enum finalto prevent it)
- You can get a list of all the possible values (see below)
This Enum class is not intended to replace class constants, but only to be used when it makes sense., (*5)
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., (*6)
One advantage over using class constants is to be able to use an enum as a parameter type:, (*7)
function setAction(Action $action) {
    // ...
}
Documentation
- 
__construct()The constructor checks that the value exist in the enum
- 
__toString()You canecho $myValue, it will display the enum value (value of the constant)
- 
getValue()Returns the current value of the enum
- 
getKey()Returns the key of the current value on Enum
- 
equals()Tests whether enum instances are equal (returnstrueif enum values are equal,falseotherwise)
Static methods:, (*8)
- 
from()Creates an Enum instance, checking that the value exist in the enum
- 
toArray()method Returns all possible values as an array (constant name in key, constant value in value)
- 
keys()Returns the names (keys) of all constants in the Enum class
- 
values()Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
- 
isValid()Check if tested value is valid on enum set
- 
isValidKey()Check if tested key is valid on enum set
- 
assertValidValue()Assert the value is valid on enum set, throwing exception otherwise
- 
search()Return key for searched value
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()., (*9)
If you care about IDE autocompletion, you can either implement the static methods yourself:, (*10)
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):, (*11)
/**
 * @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., (*12)
When migrating from myclabs/php-enum, the effort should be small if the usage was in the recommended way:
- private constants
- final classes
- no method overridden, (*13)
Changes for migration:
- Class definition should be changed from, (*14)
/**
 * @method static Action VIEW()
 * @method static Action EDIT()
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}
to, (*15)
enum Action: string
{
    case VIEW = 'view';
    case EDIT = 'edit';
}
All places where the class was used as a type will continue to work., (*16)
Usages and the change needed:, (*17)
| Operation | myclabs/php-enum | native 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 == $enumCase2br/ 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 enum | Action::values() | Action::cases() | 
| Get a map of possible instances of the enum mapped by name | Action::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 enum | Action::keys() | array_map(fn($case) => $case->name, Action::cases()) | 
| Get a list of all possible backed values of the enum | Action::toArray() | array_map(fn($case) => $case->value, Action::cases()) | 
| Get a map of possible backed values of the enum mapped by name | Action::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())) |