我正在开发一个有趣的网站,我正在尝试实现基于按位运算符的目录访问控制。
我已经定义了GUEST = 1, GROUP1 = 15 and GROUP2 = 23
如果我比较
echo (23 & 1); // print 1
但如果我定义GUEST
,GROUP1
和GROUP2
:
define('GUEST', 1);
define('GROUP1', 15);
define('GROUP2', 23);
// and then
echo (GROUP2 & GUEST); // print 0
echo USER_GUEST.','.USER_ROLES1.','.USER_ROLES2; // print 1,15,23`
GROUP1
没问题:
echo (GROUP1 & GUEST); print 1.
我哪里错了?一些建议? 感谢。
我发现了一些非常奇怪的东西:我的GUEST,GROUP1和GROUP2在一个ini文件中声明,我用函数parse_ini_file解析(self :: $ fileName,true);在课堂上。 在我解析文件之后,我递归地定义了在[DEFINE]部分(一个简单的技巧)下定义的couple key = value。 如果我在那里评论我的GROUP2 = 23定义并且我在当前脚本(GROUP2& GUEST)中声明它返回1!
答案 0 :(得分:1)
确保为您的群组使用基数2,即1,2,34,8,16,32 ......或者您可以互相踩踏。这是在位域中执行权限的正确方法。
define('GUEST', 1);
define('GROUP1', 2);
define('GROUP2', 4);
$groups |= GUEST;
$groups |= GROUP1;
if($groups & GUEST) {
// This user is a guest (it is)
}
if($groups & GROUP1) {
// This user is in group 1 (it is)
}
if($groups & GROUP2) {
// This user is in group 2 (it is NOT)
}
答案 1 :(得分:0)
PHP 5.3:
php > define('GUEST', 1);
php > define('GROUP1', 15);
php > define('GROUP2', 23);
php > echo GROUP2 & GUEST;
1
php > echo GROUP1 & GUEST;
1
您使用的是什么PHP版本?
Artefacto指出了一个可能的字符串问题(e:但似乎收回了他的帖子,hm)。再次在5.3中:
php > var_export(GUEST);
1
php > var_export(GROUP1);
15
php > var_export(GROUP2);
23
php > define('GUEST_AS_STRING', '1');
php > var_export(GUEST_AS_STRING);
'1'
php > echo GROUP1 & GUEST_AS_STRING;
1
php > echo GROUP2 & GUEST_AS_STRING;
1
'1'是字符49. 49 & 15
是1,但49 & 23
是17.我不相信这是字符串问题...
答案 2 :(得分:0)
解决。
我完全误解了php manual中的声明,他们在Changelog中说:
5.2.4由数字组成的键和节名现在被评估为PHP整数,因此从0开始的数字被计算为八进制数,以0x开始的数字被计算为十六进制数。
绝对清楚:键和部分名称......不是值!
parse_ini_file()函数将整数值计算为PHP字符串,即使它们未用双引号括起来。这很可惜,但确实如此; - )
感谢您的合作