Enums are a new "type", they are different to any existent type.(if not, what is the point of creating them)
Everybody agree that an enum is a set, in the mathematically point of view, of names and values. What we are discussing here is what should be those "values". IMO that should be a programmer decision. Someone may like strings, other integer. Pragramers may want a simple enum... a couple of ordered elements, the element itself is the value. enum Letters { A, B, C, [...], Z; } $a = Letters::A; echo $a; // it would be nice to echo 'A' but there are other situation where is not enough with the name, where you need "values" enum Numbers { ONE(1), TWO(2), THREE(3), [...], NINE(9); private $value; function __construct($value) { $this->value = $value; } function valueOf() { return $this->value; } static function getNumber($value) { switch( $number ) { case 1: return self::ONE; case 2: return self::TWO; [...] case 9: return self::NINE; } } } $num = Numbers::ONE; var_dump( $num ); // enum (Numbers::ONE) ??? var_dump( $num->valueOf() ); // integer (1) $four = Numbers::getNumber( 4 ); And note this has the same limitations that today's define: enum BadEnum { A( func() ), // error B( $obj->meth() ), // error C( new Object ); // error } And the enum implementation could provide some helpful methods out the box, like __toString, or fromString enum MySqlEnum { A_CONSTANT, ANOTHER_ONE; } $foo = MySqlEnum::A_CONSTANT; var_dump( (string) $foo ); // string "A_CONSTANT" var_dump( MySqlEnum::ANOTHER_ONE === MySqlEnum::fromString('ANOTHER_ONE')); MySqlEnum::getIterator(); // to iterate over the enum elements Martin Scotta On Fri, Feb 18, 2011 at 1:19 PM, Hannes Landeholm <landeh...@gmail.com>wrote: > Let me jump in here and say that I agree that strings are useful. IMO > any scalar type should be allowed for enum's. String enum's are great > for understanding debug data. Also it would integrate smoothly with > MySQL enums (building queries) and when you want to model enumerations > in an external API or framework. When you say "enums should be > integers" you assume that the programmer has the final decision on the > values. But if you want to enumerate possible string return codes from > an external API you'd be forced to write a translation function that > translate the values you read to the internal enumeration > representation. > > For example, say that http://www.example.org/api can return either > "fail", "success" or "timeout", you'd like to put these in an > enumeration so they make sense instead of having magic values > scattered across the code. > > enum ExampleReturnCodes { > FAILURE = "fail"; > SUCCESS = "success"; > TIMEOUT = "timeout"; > } > > if ($ret == ExampleReturnCodes::FAILURE) > echo "noes"; > > This also highlights why it would be nice to name enumerations just > like classes. They provide a handle for the constants within so they > can be used for reflection. See, I'd like to do something like: > > if ($ret enumof ExampleReturnCodes) > \trigger_error("Unknown enumeration value returned!", \E_USER_ERROR); > > and: > > print("Got: " . ExampleReturnCodes::getName($ret)); // PrintsGot: FAILURE > > I'm suggesting this as an additional behavior. Declaring enumerations > without names should make the contents be declared just as normal > namespace/class constants. In addition, declaring a named enumeration > "enum_name" in a class could give the enumeration the name either > "enum_name" (if it wouldn't be confusing and the named collision risk > is acceptable), "class_name::enum_name" (if the :: operator could be > programmed to also resolved enumeration types and not only class > constants), "class_name_enum_name" (if it would be acceptable to > automatically merge the class name with the enumeration name) (and > possibly other solutions). Another solution is to forbid class > enumerations from being named and only use them as a constant grouping > syntax. > > My 5 cents. > > Hannes > > On 18 February 2011 15:44, Arvids Godjuks <arvids.godj...@gmail.com> > wrote: > > Hello! > > > > I should comment on why people want strings as enum values - just look > > at ENUM type in MySQL. People use it, and if you take a look from that > > perspective - it makes sense. > > > > But we are not a MySQL only world, so it does not make sense to do > > strings, because in other databases usually 1 byte integers are used > > for that. > > > > > > P.S. But I really like MySQL ENUM, it's really helpfull to see some > > meaningfull representation instead of plain numbers. And MySQL is able > > to convert enum to real integer like it is stored internaly: SELECT > > enum + 0 AS enum FROM table. Will get you the numbers, not the string > > representations. So it's really no brainer to make enumerations to > > work transparently with MySQL. > > > > 2011/2/18 Jarrod Nettles <jnett...@inccrra.org>: > >> I did some research on methods in enums and discovered that there is > some usefulness to the idea - I wouldn't go so far as to say that they would > be needed, but C#, for example, allows you to create extension methods for > enums and MSDN has a decent real-world example of its use. > >> > >> http://msdn.microsoft.com/en-us/library/bb383974.aspx > >> > >> I still don't understand why we would need string values (or any other > non-integral type) but like you said Ben - if you need something like that > you're not using the right datatype. Build a class. Here's my reasoning for > enum values. > >> > >> enum Wood{ > >> OAK, > >> ASH, > >> WILLOW, > >> GOPHER > >> } > >> > >> There's nothing in there that would necessitate needing a string value > and really, if you need a string value, pass in a string as your parameter! > Enumerations should be used to represent a set of data where the value > itself isn't so important, it’s the consistency of the value that's > important. It’s the fact that I've chosen gopher wood and I know that even > though Wood::GOPHER really means "3", I don't have to remember what "3" > represents because I can specifically type that I want gopher. > >> > >> > >> -----Original Message----- > >> From: Ben Schmidt [mailto:mail_ben_schm...@yahoo.com.au] > >> Sent: Thursday, February 17, 2011 4:52 PM > >> To: Martin Scotta > >> Cc: Jarrod Nettles; Thomas Gutbier; internals@lists.php.net > >> Subject: Re: [PHP-DEV] Re: Clarification on the Enum language structure > >> > >>>> Also, I feel like it should be restricted to integral types only, and > >>>> defaults to a zero-based incrementing integer. This is more in line > with > >>>> other programming languages that already implement enums and will > present > >>>> "expected behavior" for people moving over to PHP. > >>>> > >>> for me that's a plain old interpretation of constants. > >>> constant values were only integer values because of their > implementation, > >>> nowadays they could be anything you want, int, float, string and even > >>> objects. > >> > >> I partially agree with that. > >> > >> I'm going to be a bit extreme here, but here's a thought: > >> > >> An enum is something you use conceptually for a set of constant values > >> which aren't related in a numerical or other fashion (where another type > >> would make more sense). In an enum, the only meaning of a constant is > >> the meaning expressed in that constant's name. > >> > >> So you shouldn't want to use ints, floats, strings, certainly not > >> objects, for enum values. If you feel yourself wanting to do this, an > >> enum is not the right datatype for your purpose--you should be using one > >> of those other types instead, possibly with a very few defined constants > >> for commonly-used or 'magic' values. > >> > >> The issue, then, of what type underlies an enum is mostly to do with > >> internal implementation, and more importantly, serialisation. Integers > >> are the simplest and most obvious way to do this. But short strings, > >> particularly string representations of the enum's symbols, could be a > >> nice way to make serialised data more readable, and less fragile (e.g. > >> if values are added to the enum, the mapping of strings to previous > >> constants does not change, no matter where the new value is added). > >> > >> I see no reason to use floats or objects (or resources, or arrays, or > >> ...). > >> > >> Ben. > >> > >> > >> > >> <html> > >> <body> > >> Jarrod Nettles Application Developer - Technology INCCRRA p 309.829.5327 > - f 309.828.1808 This e-mail message may contain privileged or confidential > information. If you are not the intended recipient, you may not disclose, > use, disseminate, distribute, copy > >> or rely upon this message or attachment in any way. If you received > this e-mail message in error, please return by forwarding the message and > its attachments to the sender. INCCRRA does not accept liability for any > errors, omissions, corruption or virus in > >> the contents of this message or any attachments that arises as a result > of e-mail transmission. Please consider your environmental responsibility > before printing this e-mail > >> </body> > >> </html> > >> > >> -- > >> PHP Internals - PHP Runtime Development Mailing List > >> To unsubscribe, visit: http://www.php.net/unsub.php > >> > >> > > > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >