Я пытаюсь создать класс «enum» в PHP, используя побитовые операции.
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;
Но я скептически отношусь к его универсальной правильности.
Должно ли это быть правильным во всех случаях (т. Е. Если я добавлю более сложные разрешения в enum)? Или есть лучший / более правильный способ сделать это?
Задача ещё не решена.
Других решений пока нет …