> On Mar 29, 2023, at 06:56, Rowan Tommins <rowan.coll...@gmail.com> wrote:
> 
> 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;
>       }
>   }
> }

The issue of contention here is that inheritance isn't the correct mechanism 
for reusing enum definitions to expand on them. What about allowing "use" 
syntax  like traits?

enum HttpErrors {
   case HTTP_STATUS_400;
   case HTTP_STATUS_401;
    …
}

enum ApiErrors {
   use HttpErrors;

   case JsonParserError;
   case GraphQLParserError;
}

Now you have ApiErrors::HTTP_STATUS_400 etc without ApiErrors being is-a 
HttpErrors.

- Davey

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to