Побитовая ошибка работы? - PullRequest
0 голосов
/ 13 августа 2010

Я разрабатываю сайт для развлечения и пытаюсь реализовать управление доступом к каталогам на основе побитовых операторов.
Я определил 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] (простой трюк).Если я прокомментирую там мое определение GROUP2 = 23 и объявлю его внутри текущего скрипта (GROUP2 & GUEST), вернем 1!

Ответы [ 3 ]

1 голос
/ 13 августа 2010

Убедитесь, что вы используете базовые 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)
}
0 голосов
/ 14 августа 2010

решаемая.
Я полностью неправильно понял объявление в php manual , где в Changelog говорится:

* 1006.

Абсолютно ясно: ключи и имя раздела ... не значения!
Функция parse_ini_file () оценивает целочисленные значения как строку PHP, даже если они не заключены в двойные кавычки. Жаль, но так оно и есть; -)

Спасибо за сотрудничество

0 голосов
/ 13 августа 2010

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 вы используете?


Артефакт указал на возможную проблему со строкой (например, но, похоже, отозвал свой пост, хм). Опять в 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. Я не уверен, что это строковая проблема ...

...