为什么我应该在 PHP 中使用 bitwise/bitmask?

2022-08-30 21:29:07

我正在为脚本在PHP中处理用户角色/权限系统。

下面是一个使用位掩码方法的代码,用于我在 phpbuilder.com 上找到的权限。

在那部分下面是一个更简单的版本w3hich,可以在没有位部分的情况下做基本上同样的事情。

许多人建议在PHP中使用位运算符等设置和其他内容,但我一直不明白为什么。在下面的代码中,使用第一个代码而不是第二个代码有什么好处吗?

<?php
/**
 * Correct the variables stored in array.
 * @param    integer    $mask Integer of the bit
 * @return    array
 */
function bitMask($mask = 0) {
    $return = array();
    while ($mask > 0) {
        for($i = 0, $n = 0; $i <= $mask; $i = 1 * pow(2, $n), $n++) {
            $end = $i;
        }
        $return[] = $end;
        $mask = $mask - $end;
    }
    sort($return);
    return $return;
}


define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);

//run function
// this value would be pulled from a user's setting mysql table
$_ARR_permission = bitMask('5');

if(in_array(PERMISSION_READ, $_ARR_permission)) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}
?>

非位版本

<?PHP
/*
   NON bitwise method
*/

// this value would be pulled from a user's setting mysql table
$user_permission_level = 4;

if($user_permission_level === 4) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}

?>

答案 1

为什么不直接这样做...

define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);

//run function
// this value would be pulled from a user's setting mysql table
$_ARR_permission = 5;

if($_ARR_permission & PERMISSION_READ) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}

您还可以创建许多任意权限组合(如果使用位...

$read_only = PERMISSION_READ;
$read_delete = PERMISSION_READ | PERMISSION_DELETE;
$full_rights = PERMISSION_DENIED | PERMISSION_READ | PERMISSION_ADD | PERMISSION_UPDATE | PERMISSION_DELETE;

//manipulating permissions is easy...
$myrights = PERMISSION_READ;
$myrights |= PERMISSION_UPDATE;    // add Update permission to my rights

答案 2

第一个允许人们拥有很多权限 - 例如读取/添加/更新。第二个示例,用户只有 .PERMISSION_UPDATE

按位测试的工作原理是测试位的真值。

例如,二进制序列将使用 和 (位标识是 2 的列,位标识是 16 的列)来标识用户),二进制是十进制的 18 (16 + 2 = 18)。您的第二个代码示例不允许您进行此类测试。你可以做大于样式的检查,但这假设每个人都应该有 ,这可能不是一个有效的假设。10010PERMISSION_DELETEPERMISSION_READPERMISSION_READPERMISSION_DELETE10010PERMISSION_DELETEPERMISSION_UPDATE


推荐