Re: Let's discuss enums!

From: Date: Fri, 18 Sep 2015 00:15:43 +0000
Subject: Re: Let's discuss enums!
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-88302@lists.php.net to get a copy of this message
> Am 18.09.2015 um 01:56 schrieb Rowan Collins <rowan.collins@gmail.com>: > > On 18/09/2015 00:16, Marcio Almada wrote: >> A kitten is working on thathttps://wiki.php.net/rfc/enum. >> Many points >> on the linked RFC are compatible to the points you raised so it might >> be worth reading before even starting any new proposal. > > Aha, I hadn't seen that, should have thought to search the wiki. Still, interesting that > we seems to mostly agree on the key decisions, although I've gone into more detail about things > that he's left as Future Scope, which is fair enough. > > The main thing I'd change if I was writing it is the implicit "ordinal" > property; I don't really see the point of insisting that the order I write "Red, Green, > Blue" has some meaning. On the other hand, I'd give much more prominence to the name, e.g. > by making values() return an associative array. You're much more likely to want to say > "the value whose name is 'RED'" than "the value I defined first in the > list", IMHO. > > If you have some kind of initialiser syntax for the values - with or without a constructor - > you get to have ordinals or explicit values (like the Flags example) if you want them, and just > names if not: > > enum RenewalAction{ > Deny( 0 ), > Approve( 1 ); > > public $ordinal; > } > enum Flags{ > a (1 << 0), > b( 1 << 1), > c( 1 << 2), > d( 1 << 3 ); public $value; } > > enum PimaryColours { RED, GREEN, BLUE } > > Regards, > > -- > Rowan Collins > [IMSoP] The reason it is not an associative array is that the names are not important. But we actually need ordinal(), else we'll end up writing array_search(TheEnum::values(), $value). It's mainly important for the purpose of serializing/unserializing (manually or internally). You never should *rely* on the ordinal value of the enum for anything. Enums are supposed to be value-less. It's a type. It's not a value. The only usage of the value is going external. Also, I honestly think the Flags example is a bad one. (At least as long as we don't have a possibility to typehint combined enums...). If you need that, use class constants. They provide exactly what you need. Bob

« previous php.internals (#88302) next »