PHP.nl

Enum values in constant expressions

Enum-waarden in constante expressies

Omdat cases worden weergegeven als constanten op de enum zelf, kunnen ze worden gebruikt als statische waarden in de meeste constante expressies: standaardwaarden voor eigenschappen, standaardwaarden voor statische variabelen, standaardwaarden voor parameters, globale en class constante waarden. Ze mogen niet worden gebruikt in andere enum case waarden, maar normale constanten kunnen verwijzen naar een enum case.

Echter, impliciete magische methode-aanroepen zoals op enums zijn niet toegestaan in statische of constante definities, omdat we niet absoluut kunnen garanderen dat de resulterende waarde deterministisch is of dat de methode-aanroep vrij is van bijwerkingen. Functie-aanroepen, methode-aanroepen en toegang tot eigenschappen blijven ongeldige bewerkingen in constante expressies. ArrayAccess

<?php

// Dit is een volledig legale Enum-definitie.
enum Direction implements ArrayAccess
{
    case Up;
    case Down;

    public function offsetExists($offset): bool
    {
        return false;
    }

    public function offsetGet($offset): mixed
    {
        return null;
    }

    public function offsetSet($offset, $value): void
    {
        throw new Exception();
    }

    public function offsetUnset($offset): void
    {
        throw new Exception();
    }
}

class Foo
{
    // Dit is toegestaan.
    const DOWN = Direction::Down;

    // Dit is niet toegestaan, omdat het mogelijk niet deterministisch is.
    const UP = Direction::Up['short'];
    // Fatale fout: Kan [] niet gebruiken op enums in constante expressie
}

// Dit is volledig legaal, omdat het geen constante expressie is.
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));

$foo = new Foo();
?>

Documentatie