PHP/enum: Difference between revisions

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
No edit summary
No edit summary
 
Line 41: Line 41:
|}
|}
==Caveats==
==Caveats==
There is no <code>is_enum()</code> function.
<code>Enum</code>s are similar to objects in that:
<code>Enum</code>s are similar to objects in that:
* An <code>enum</code> case will pass the [https://www.php.net/manual/en/function.is-object.php <code>is_object()</code>] test. (I think.)
* An <code>enum</code> case will pass the [https://www.php.net/manual/en/function.is-object.php <code>is_object()</code>] test. (I think.)

Latest revision as of 12:31, 15 March 2026

Template:Fmt/title

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 Template:L/php/native returns a packed array of all defined cases, in order of declaration
static function tryFrom(int|string $value) ?static Template:L/php/native same as from(), but returns NULL if not found (instead of erroring)
static function from(int|string $value) static Template:L/php/native same as tryFrom, but throws an error if not found
dynamic property $name string Template:L/php/native the name of the case (case-sensitive)
dynamic property $value int or string Template:L/php/native the value of the case

Caveats

There is no is_enum() function. 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()):

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]