I few questions wrt the rfc: https://wiki.php.net/rfc/enum
> An enum value is only equal to itself. I'm not sure I agree. How then do I store the enum into a DB and compare it after reading? switch($db->query('select role from user where user_id = 123')->fetch()[0]) { case UserRole::Admin: include 'admin.php'; break; case UserRole::User; include 'user.php'; break; default: include 'login.php'; break; } Would this not ALWAYS include login if UserRole is an enum (instead of a final class with constants as I use now, which a switch like this will work for)? Is this only possible with the magic value method? In which case I'd have to check the value method, something like case UserRole::Admin->ordinal() (or name, or value or whatever)? > This means that if the name enum is used for a property, function, method, class, trait or interface there will now be a parse error instead. Surely, a property can be named enum, since it can be named other reserved words, for example? $ php <?php class Foo { public $function = 'callMe'; public $trait = 'useMe'; public $class = 'instantiateMe'; } $f = new Foo(); var_dump(get_object_vars($f)); array(3) { 'function' => string(6) "callMe" 'trait' => string(5) "useMe" 'class' => string(13) "instantiateMe" } Also, I really like the idea of being able to type hint the enum in the switch(UserRole) that was mentioned. Not sure I like the idea of an implicit throw though, consider the UserRole above, I might have 10 different roles, but the current switch is only valid for 5 of those roles. In this situation, if I add a default: return Auth::NotAuthorized; will that supress the implicit fall throw? If so, how often will the implicit throw really be hit? I know we have standards that all case statements must have default statements, to make sure every case is handled, whether we foresaw it or not.