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

Php 意外行为后的用户权限二进制/十进制混淆,php,Php,首先,我不明白为什么有些人使用二进制数和二的幂作为权限。是因为它们代表真/假,1/0代表向后关系吗 例:1010表示假、真、假、真 我的问题如下15与二进制代码>1111相同,但: DEFINE ('READ',1); DEFINE ('WRITE',2); DEFINE ('EDIT',4); DEFINE ('DELETE',8); $current = 15; if ($current & READ) print("can read <br />"); if ($c

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

例:
1010表示假、真、假、真

我的问题如下<十进制代码>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 />");

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

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


1111
是壹仟壹佰壹拾壹,而不是二进制1111。同样,请参见使用
bindec
将二进制转换为十进制。解释器如何知道1111不是十进制而是二进制?它不是通灵的。我说的对吗,如果你读二进制反转,它将你定义的真/假顺序与2的幂的值相匹配?是的,这就是二进制的工作方式。2=10,4=100,8=1000…这种技术称为按位:
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 />");
$current = bindec('1111'); //Is the same as $current = 15;