PHP/enum

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
< PHP
Jump to navigation Jump to search
PHP enum support

Examples

"Basic" enum "Backed" enum
enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;
}
enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

Methods

kind of thing name & args returns defined in description
static function cases() array UnitEnum returns a packed array of all defined cases, in order of declaration
static function tryFrom(int|string $value) ?static BackedEnum same as from(), but returns NULL if not found (instead of erroring)
static function from(int|string $value) static BackedEnum same as tryFrom, but throws an error if not found
dynamic property $name string UnitEnum the name of the case (case-sensitive)
dynamic property $value int or string BackedEnum the value of the case

Caveats

Enums are similar to objects in that:

  • An enum case will pass the is_object() test. (I think.)
  • They may implement interfaces.
  • Code in their methods may use self:: and $this->.
  • The ::class magic constant works.

Enums are different from objects in that:

  • They cannot be extended, or extend other entities.
  • They can't have constructors or destructors.
  • They can't have static properties.
  • The ::class magic constant exists on individual cases (enum instances) as well.
  • An enum can't be instantiated like an object; individual cases are similar to singleton objects.
    • Cases also provide the ::class magic constant. (I don't think this works on regular objects.)

Not sure if enum cases can be used as switch cases (to be checked).

Documentation

Note that enums can be cast directly to arrays.

3rd party

Sample Code

To get a UnitEnum enum from a case name (equivalent to from()/tryFrom()):

  • constant("<enum name>::{$value}")

Tests

  • is an enum case an object (is_object)? [YES]
  • is an enum seen as is_a UnitEnum? [YES]
  • is an enum an instanceof UnitEnum? [YES]
  • is an enum an instanceof enum? [no]