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 <cschn...@cschneid.com> wrote:
>
> Am 29.03.2023 um 11:55 schrieb Tim Düsterhus <t...@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
>

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

Reply via email to