Re: [RFC] Enumerations
| From: | Rowan Tommins | Date: | Sat, 05 Dec 2020 20:18:55 +0000 |
| Subject: | Re: [RFC] Enumerations | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-112433@lists.php.net to get a copy of this message | ||
On 05/12/2020 19:21, Marc Bennewitz wrote:
I mean on mapping something to something else defined as a single assoc array constant. Something like: enum Role { case User, case Admin, ... } enum Action { case Order_Edit, case Order_Read, private const BY_ROLE = [That example can be rewritten directly as a static method and match statement, which I think would look like this: enum Action { case Order_Edit; case Order_Read; private static function byRole(Role $role) {Role::User => [self::Order_Read], Role::Admin => [self::Order_Read, self::Order_Edit],]; public function isAllowed(User $user) {return in_array($this, self::BY_ROLE[$user->role]);} }
return match($role) {
Role::User => [self::Order_Read],
Role::Admin => [self::Order_Read, self::Order_Edit],
};
}
public function isAllowed(User $user) {
return in_array($this, self::byRole($user->role));} } The scenario can also be modelled the other way around with case methods: enum Action { public function isAllowed(User $user) {
// Default case denying all, might be useful with a long list of cases
return false;
}
case Order_Edit {
public function isAllowed(User $user) {
return $user->role === Role::Admin;
}
}
case Order_Read {
public function isAllowed(User $user) {
return $user->role === Role::User
|| $user->role === Role::Admin;
}
}
}
Regards,
--
Rowan Tommins (né Collins)
[IMSoP]