意外行为后的用户权限二进制/十进制混淆



首先我不明白为什么有些人使用二进制数和2的幂作为权限。是因为它们以1/0的反向关系代表真/假吗?

Ex: 1010 means false, true, false, true ?

我的问题如下。十进制的15与二进制的1111相同,BUT:

DEFINE ('READ',1);
DEFINE ('WRITE',2);
DEFINE ('EDIT',4);
DEFINE ('DELETE',8);
$current = 15;
if ($current & READ) print("can read <br />");
if ($current & WRITE) print("can write <br />");
if ($current & EDIT) print("can edit <br />");
if ($current & DELETE) print("can delete <br />");

输出允许所有权限,正如我所期望的那样。但是,如果我用1111更改15,那么它只显示其中3个是允许的,而不是所有四个(delete权限无效):

DEFINE ('READ',1);
DEFINE ('WRITE',2);
DEFINE ('EDIT',4);
DEFINE ('DELETE',8);
$current = 1111;
if ($current & READ) print("can read <br />");
if ($current & WRITE) print("can write <br />");
if ($current & EDIT) print("can edit <br />");
if ($current & DELETE) print("can delete <br />");

这不是很奇怪吗?我理解错了吗?我需要一些帮助来理解这一点。我应该将权限存储为小数还是二进制?

正如@mensi和@datasage在评论中所说,1111不是二进制的1111,而是十进制的1111 !如果您希望将权限以二进制形式(例如,为了更好的可读性),您可以使用bindec:

$current = bindec('1111'); //Is the same as $current = 15;

最新更新