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