PHP Каскадное побитовое перечисление - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь создать в PHP класс «enum», используя побитовые операции.

class PermissionBitmap {
    const VIEW = 1;
    //if you can EDIT, you can VIEW
    const EDIT = 2 | self::VIEW;
    //if you can CREATE, you can VIEW
    const CREATE = 4 | self::VIEW;
    //if you can DELETE you can VIEW
    const DELETE = 8 | self::VIEW;
    //if you are ADMIN you can VIEW, EDIT, CREATE and DELETE
    const ADMIN = self::EDIT | self::CREATE | self::DELETE;

    //function to check if $permisison1 is contain within $permision2
    //    perm_contains(self::VIEW, self::CREATE);  //should return true.
    //    perm_contains(self::DELETE, self::ADMIN);  //should return true.
    //    perm_contains(self::CREATE, self::EDIT);  //should return false.
    public static function perm_contains($permisison1, $permisison2): bool  {
        return ($permisison1 & $permisison2) === $permisison1;
    }
}

var_dump(PermisisonBitmap::EDIT);  //sums to 3... all correct bits are set
var_dump(PermissionBitmap::ADMIN);  //sums to 15... all correct bits are set

Итак, я настроил enum для каскадного отображения так, чтобы конкретные разрешения содержались в более высокихиз них.(например, VIEW должен содержаться в EDIT, CREATE и DELETE. Все должно быть в ADMIN).Я думаю, что использование побитового или (|) является правильным способом сделать это, и, кажется, дает правильные результаты.

Проблема у меня заключается в том, как проверить, учитывая два разрешения, если одно содержитсяв другой.В настоящее время у меня есть ($permisison1 & $permisison2) === $permisison1;, но я скептически отношусь к его универсальной правильности.

Должно ли это быть правильным во всех случаях (например, если я добавлю более сложные разрешения в перечисление)?Или есть лучший / более правильный способ сделать это?

...