> Am 18.09.2015 um 01:56 schrieb Rowan Collins <rowan.coll...@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 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php