Re: Let's discuss enums!

From: Date: Fri, 18 Sep 2015 14:42:44 +0000
Subject: Re: Let's discuss enums!
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-88328@lists.php.net to get a copy of this message
Levi et al, On Fri, Sep 18, 2015 at 10:11 AM, Levi Morrison <levim@php.net> wrote: > On Thu, Sep 17, 2015 at 5:52 PM, John Bafford <jbafford@zort.net> wrote: >> On Sep 17, 2015, at 19:16, Bob Weinand <bobwei9@hotmail.com> wrote: >>> >>>> Am 18.09.2015 um 01:06 schrieb Rowan Collins <rowan.collins@gmail.com>: >>>> >>>> This has come up in passing a few times recently, but I'm not sure >>>> there's ever been a dedicated discussion of it: would it be useful for PHP to have a built-in >>>> Enumeration type, and if so, how should it look? >>> >>> I like enums in general, but I'd like to note that there's already a RFC in >>> draft by Levi: >>> >>> https://wiki.php.net/rfc/enum >>> <https://wiki.php.net/rfc/enum> >>> >>> As far as I know, the RFC is already fairly final and just lacks an implementation. >>> >>> So, I'd consider bikeshedding an actual RFC first. >> >> >> If we’re bikeshedding, one feature I would really like to see, with typehinting, is >> warnings if all cases of an enum aren’t handled in a switch. So, for example, given our example >> Weekdays enum, if I wrote this code: >> >> switch(Weekday $someWeekday) { >> case Weekday::MONDAY: break; >> case Weekday::TUESDAY: break; >> } >> >> By providing the typehint, I’m indicating that I want to get a warning/error that the >> switch does not cover all enum values. This would be very handy if an enum value is added after >> initial development and someone misses a switch statement in cleanup. >> >> The typehint would also allow generating a warning if someone did something like >> >> switch(Weekday $someWeekday) { >> //case … all the weekdays: break; >> case ‘I am not a Weekday’: echo ‘Generate a fatal error here because string >> is not a Weekday.’; >> } > > I've looked into this but not in the same syntax you've provided. I > was exploring a match construct that has different semantics: > > match ($foo) { > case Weekday::Monday: { > echo "Monday"; > } // it is not possible to fall-through with match/case > > case Weekday::Tuesday: echo Monday; // single expression > doesn't need braces > } // if it hits the end without a match a runtime error will be emitted > > I think this fits into the dynamic behavior of PHP a little better > than forcing a case for each enum value at compile-time, even if it > was possible (I suspect it is not). This is basically pattern matching. And while I'd LOVE to see support for it in PHP, I think it's a bit off-topic here. Perhaps a new thread could be opened for it (or ideally a RFC)...? As far as enums, I wonder if they would be necessary if we supported algebraic types, since you could define an "enum" as a virtual type: const MONDAY = 0; const TUESDAY = 1; const WEDNESDAY = 2; const THURSDAY = 3; const FRIDAY = 4; use MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY as WEEKDAY; function foo(WEEKDAY $day) { // must be an integer 0-4, or castable to 0-4 unless strict_types is on.. } Just a thought... Anthony

« previous php.internals (#88328) next »