Re: [RFC] Enumerations

From: 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 = [
     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]);
} }
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) {
    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]

« previous php.internals (#112433) next »