Hey Rokas,

The idea of declaring an enum `abstract` is potentially worth exploring
(I'm not convinced, but go for it), but beware that removing the implicit
`final` from ENUMs is a BC break, since it breaks the assumption that an
ENUM is a sealed type.

If you design a proposal now, you need to consider that `final` as the
implicit default is an existing contract that really enables ENUM usage.

Marco Pivetta

https://mastodon.social/@ocramius

https://ocramius.github.io/


On Wed, 29 Mar 2023 at 11:05, Rokas Šleinius <rave...@gmail.com> wrote:

> > to restrict options within a certain range.
> Okay that's an aspect of enums that I never gave much thought to, but
> you're completely right.
>
> However to be explicit about that aspect of functionality one would
> then have to also be
> allowed to define final enums.
>
> That way you still have both options - to restrict the option set, but
> to also allow adding
> custom ones while benefiting from other enum advantages.
>
> Thus, rfc idea seems to be:
>  * enums should be able to extend other enums;
>  * abstract enums;
>  * enums allowed to implement interfaces;
>  * final enums (NEW!)
>
>
>
> > BackedEnum&MyCustomBehaviorInt
> That's a fascinating approach but to a different problem than illustrated
> in OP.
>
> Would you mind sharing (in private preferably to not distract from the
> discussion) the
> gist of the problem this solves? I'm really curious, as I've yet to
> use intersect types :)!
>
> On Wed, 29 Mar 2023 at 11:47, Robert Landers <landers.rob...@gmail.com>
> wrote:
> >
> > On Wed, Mar 29, 2023 at 10:31 AM Rokas Šleinius <rave...@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
> > >
> >
> > Hey Rokas,
> >
> > My approach has been to use an intersection type like:
> > BackedEnum&MyCustomBehaviorInterface
> >
> > This works for me but it'd be interesting if something like that
> > wouldn't work for you.
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>
>

Reply via email to