Re: [IDEA] allow extending enum

From: Date: Wed, 29 Mar 2023 11:01:44 +0000
Subject: Re: [IDEA] allow extending enum
References: 1 2 3 4 5 6 7 8  Groups: php.internals 
Request: Send a blank email to internals+get-119767@lists.php.net to get a copy of this message
Hi! There's a hypothetical (based on a similar real world problem that I am facing) example for the use of extending enums in the OP. And I don't suppose Tim was arguing for not allowing enum extendability, but rather contributing a real world example where users who were having some totally legal fun hacking around with internal PHP code would break said internal PHP code. Which may or may not be a big deal from my uneducated point of view, just saying :) And all could be prevented just by adding a final statement to the definition of IntervalBoundary. On Wed, 29 Mar 2023 at 13:42, Christian Schneider <cschneid@cschneid.com> wrote: > > Am 29.03.2023 um 11:55 schrieb Tim Düsterhus <tim@bastelstu.be>: > > On 3/29/23 11:42, Sebastian Bergmann wrote: > >> Am 29.03.2023 um 11:31 schrieb Rokas Šleinius: > >>> I wouldn't say removing the final attribute from enums actually > >>> "breaks" any functionality. > >> I am with Marco on this: removing the "finality" from enum would be a > >> major backward compatiblity break as it breaks a fundamental assumption > >> about enums. > > > > And to give a specific example from PHP 8.3: As part of the Randomizer additions RFC > > (https://wiki.php.net/rfc/randomizer_additions), PHP 8.3 got its first "natively included" > > enum (\Random\IntervalBoundary). This enum works together with the new Randomizer::getFloat() method > > to specify if the given min and max value may be returned or not. > > > > The Randomizer::getFloat() method internally includes switch statement that chooses the > > implementation based on the IntervalBoundary value given. > > > > If a user would be able to extend the IntervalBoundary enum, the method would not be able > > to make sense of it. > > > > The IntervalBoundary enum completely enumerates all four possible combinations for the two > > possible states for each of the two boundaries (2*2 = 4). By definition there is no other valid > > value. > > I do understand the reason behind making Enums final and your example illustrates the point > very well. > > I still have a question I already asked in a different context: If there ever is the need to > add a case to an Enum, was there any thought put into making this possible? Or is this categorically > ruled out when using Enums? > > Let’s look at a very, very hypothetical example: Imagine a Randomizer is much, much slower > for certain boundaries and it is decided that some programs do not care about Closed/Open but > instead care more about speed. So they would want to use something like IntervalBoundary::Fastest. > > As far as I understand such an addition would *never* be possible, right? This means people > defining Enums have to be very very certain that no one will ever want another value, right? > > Regards, > - Chris > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php >

« previous php.internals (#119767) next »