Re: Let's discuss enums!
| From: | Bob Weinand | 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