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

时间:2013-03-07 17:05:26

标签: php

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

Ex:1010 means false, true, false, true

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

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 />");

这不奇怪吗?我不明白吗?我需要一些帮助来理解这一点。我应该在db?

中将权限存储为小数或二进制文件

1 个答案:

答案 0 :(得分:1)

正如@mensi和@datasage在评论中所说,1111不是二进制数字1111,是十进制数字1111!如果您想将权限设置为二进制(例如,为了更好的可读性),您可以使用bindec

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