Re: [IDEA] allow extending enum
| From: | Marco Pivetta | Date: | Wed, 29 Mar 2023 08:47:18 +0000 |
| Subject: | Re: [IDEA] allow extending enum | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-119758@lists.php.net to get a copy of this message | ||
The point of an ENUM is precisely to restrict options within a certain
range.
Assume you declared
ErrorCode with SOMETHING_BROKE and PEBKAC
as
possible enumeration values.
If you can (somewhere, anywhere in the code) check instanceof ErrorCode,
then you know it can only be SOMETHING_BROKE and PEBKAC, and you can
write logic around it accordingly.
This restriction/assumption is what makes ENUMs powerful: expanding
pre-existing enums would eliminate this very core design principle, since
you may now no longer have an ErrorCode, but some child class designed
somewhere that may not even be under your control.
Greets,
Marco Pivetta
https://mastodon.social/@ocramius
https://ocramius.github.io/
On Wed, 29 Mar 2023 at 10:31, Rokas Šleinius <raveren@gmail.com> wrote:
> 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
>
>