Enums were a very useful addition to PHP, however one aspect of them is neither
explicitly documented - or seemingly even talked about.

Enums were implemented as final so they cannot be extended nor can extend
anything else.

>From a user perspective it's surprising - and actually limiting.

USAGE EXAMPLE:
I am making an error management system: each error presented to the user
must have a unique code visible.

```php
class SystemError
{
    public function __construct(
        private string $errorText,
        private ErrorCode $code
    ) {
    }

    public function __toString():
    {
        return $this->errorText . ' ' . $this->code->toString();
    }
}
// ...

enum ErrorCode
{
    case Code_1;
    case Code_2;

    public function toString(): string
    {
        return 'Error code:' . substr($this->name, strlen('Code_'));
    }
}
```

Now I want to modify it to support different modules with different
namespaces for
errors, e.g. an ApiError, simple enough:

```php
enum BaseErrorCode
{
    // ...
}

enum ErrorCode extends BaseErrorCode
{
    case Code_1;
    case Code_2;

    // ...
}

enum ApiErrorCode extends BaseErrorCode {
    // ...
    function toString(): string
    {
        return 'Error code:API-' . substr($this->name, strlen('Code_'));
    }
}
```

This results in a syntax error.

PROPOSAL:

Enums should be able to extend other enums.

For a complete wishlist, add:
 * abstract enums;
 * enums allowed to implement interfaces;

However since I have no experience in PHP source code, I can only
provide the test suite for a possible PR this might have :(

Do you think this is likely to get implemented?

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to