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

> Ok so I am trying to find the argumentation here:
>
> >This is by design.
> >The point of enums is to be limiting.
>
> This is clearly an assumption. That statement is not in the docs or
> RFC, nor such an oversimplification makes logical sense to me, but
> maybe you have a source to back it up..?
>


>From a theory point of view, *any* type definition is about limiting
allowed values. The difference between "mixed" and "integer" is that
"mixed" allows both 'Hello' and 42, but "integer" does not - it defines a
tighter limit.

In the same way, saying "I accept an error code" means "I accept an error
code *and nothing else*" - the definition of what is and what isn't an
"error code" is deliberately a *limit* on the values that you accept.



>
> >Re: problem in the OP
> >You are approaching the design of this in a fundamentally wrong way.
>
> The described problem is dealing with error *codes* not *types*



An enum is a type, so that's why George was talking about types. He was
making the same point, in different words, as I did: the relationship
between types implied by the keyword "extends" is not the relationship you
want in this case.



> The set in question is *finite*, as you say of course, but much larger
> and different in principle than in the solution you are proposing.
> Problem in OP is looking for a way for end users to keep adding new
> domains to the error codes passed to the parent system to be handled.
>


This is the key point - if you pass an error code that didn't previously
exist, the existing system *won't* be able to handle it.

That's why enums are inherently restrictive: the system wants to be able to
say "this is the list of error codes I understand, don't give me anything
else".

If you have a system that accepts the new codes as well as the old ones,
you can use a union type declaration as George says:

enum AdditionalErrorCode {
    case Code_456;
}

class ExtendedErrorHandler extends StandardErrorHandler {
    public function handle(StandardErrorCode|AdditionalErrorCode $code) {
         switch ( $code ) {
             case AdditionalErrorCode::Code_456:
                // handling for new code goes here
             break;
             default:
                 // assert($code instanceof StandardErrorCode);
                 parent::handle($code);
             break;
        }
    }
}

Regards,
-- 
Rowan Tommins
[IMSoP]

Reply via email to