Забудь, что уже у тебя в голове.
Хорошо, теперь скажем, что у вас есть несколько разных ролей: admin , user и guest .
и некоторые другие разрешения: чтение , запись и удаление
Давайте создадим несколько битовых масок для разрешений и ролей . Битовая маска - это последовательность битов, которую можно использовать для манипулирования или чтения каких-либо флагов . Как показано ниже:
// flags bitmasks
$read = 1; // 0001
$write = 2; // 0010
$delete = 4; // 0100
$admin = $read | $write | $delete; // 0001 | 0010 | 0100 => 0111
$user = $read | $write; // 0001 | 0010 => 0011
$guest = $read; // 0001 => 0001
Примечание 1, 2, 4. Это должно быть поднято как двойное. В противном случае это может привести к некоторым неудобным результатам.
Забудьте о комментируемых вещах. Это всего лишь последовательность битов (или битовых масок) для отдельных разрешений и ролей.
Теперь давайте создадим удобную функцию, которая может использоваться для проверки определенного разрешения для конкретной роли.
function isAllowed($role, $permissison) {
return $role & $permissison ? true : false;
}
Мы закончили. Давайте проверим разрешение $ delete для всех 3 ролей:
var_dump(isAllowed($admin, $delete)); // bool(true)
var_dump(isAllowed($user, $delete)); // bool(false)
var_dump(isAllowed($guest, $delete)); // bool(false)
Так почему же побитовая операция? Одним словом, побитовая операция более быстрая, лаконичная и обслуживаемая. В противном случае использование побитовой операции всегда эффективно для сложных приложений.