0

我正在开发一个有趣的网站,并且我正在尝试实现基于位运算符的目录访问控制。
我已经定义GUEST = 1, GROUP1 = 15 and GROUP2 = 23

如果我比较

echo (23 & 1); // print 1 

但如果我定义GUEST,GROUP1GROUP2:

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] 部分下定义的键=值(一个简单的技巧)。如果我在那里评论我的 GROUP2=23 定义并在当前脚本 (GROUP2 & GUEST) 中声明它,则返回 1!

4

3 回答 3

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)
}
于 2010-08-13T18:03:11.073 回答
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:但似乎已经撤回了他的帖子,嗯)。再次在 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。我不相信这是一个字符串问题......

于 2010-08-13T18:00:00.410 回答
0

解决了。
我完全误解了php 手册中的声明,他们在 Changelog 中说:

5.2.4 由数字组成的键和段名现在被评估为 PHP 整数,因此以 0 开头的数字被评估为八进制,以 0x 开头的数字被评估为十六进制。

绝对清楚:键和部分名称......不是值!
parse_ini_file() 函数将整数值计算为 PHP 字符串,即使它们没有用双引号括起来。这很可惜,但事实就是如此;-)

感谢您的合作

于 2010-08-13T22:30:03.330 回答