On Sat, Dec 5, 2020, at 1:21 PM, Marc Bennewitz wrote:

>     > * I often use metadata in enumerations and so I would be very 
>     > interested to allow constants.
> 
> 
>     Could you give an example what you mean? Metadata on individual cases is 
>     supported by methods, which map more cleanly to things like interfaces, 
>     and the notion of each case as a singleton object, not a static class.
> 
> 
>     That said, I have a related question: can enum cases be used as the 
>     *value* of constants? e.g.:
> 
>     class OldMaid {
>          public const SUIT = Suit::Spades;
>          public const VALUE = CardValue::Queen;
>     }

At present, no.  They're "just" objects, and you can't assign an object to a 
constant.  Unfortunately I'm not sure how to enable that without making them 
not-objects, which introduces all sorts of other complexity.

> 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]);
>   }
> }

Because of their object-ness, I think you'd have to use a weak map defined at 
runtime:

class AccessControl {
  private WeakMap $perms;
  public function __construct() {
    $this->perms = new WeakMap();
    $this->perms[Role::User] = [Action::Order_Read, Action::Order_Edit];
    $this->perms[Role::Admin] = [Action::Order_Read, Action::Order_Edit];
  }

  public function isAllowed($user, $action): bool {
    return in_array($action, $this->perms[$user->role]);
  }
}

--Larry Garfield

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to