On Wed, 29 Mar 2023 at 14:22, Rokas Šleinius <[email protected]> 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]