首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我要在PHP中使用位/位掩码?

为什么我要在PHP中使用位/位掩码?
EN

Stack Overflow用户
提问于 2009-09-04 15:45:40
回答 8查看 15.4K关注 0票数 18

我正在为一个脚本的PHP中的用户角色/权限系统工作。

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

在这个部分下面是一个简单得多的版本,w3hich可以在没有位部分的情况下做基本相同的事情。

很多人推荐在PHP中使用位运算符等进行设置和其他操作,但我一直不明白为什么。在下面的代码中,使用第一个代码而不是第二个代码对有什么好处吗?

代码语言:javascript
复制
<?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.';
}
?>

非位版本

代码语言:javascript
复制
<?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.';
}

?>
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-09-04 15:55:49

为什么不这样做呢..。

代码语言:javascript
复制
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.';
}

如果使用bits,还可以创建许多任意的权限组合。

代码语言:javascript
复制
$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
票数 41
EN

Stack Overflow用户

发布于 2009-09-04 15:54:01

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

按位测试通过测试位的真值来工作。

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

票数 10
EN

Stack Overflow用户

发布于 2009-09-04 16:24:38

也许只是因为我不经常使用位掩码,但我发现在PHP这样的语言中,开发人员的工作效率和代码可读性比速度或内存使用更重要(显然是在一定范围内),没有真正的理由使用位掩码。

为什么不创建一个跟踪权限、登录用户等信息的类呢?让我们称它为Auth。然后,如果您想检查用户是否有权限,您可以创建一个HasPermission方法。例如,

代码语言:javascript
复制
if(Auth::logged_in() && Auth::currentUser()->hasPermission('read'))
    //user can read

然后,如果您想检查他们是否具有某种权限组合:

代码语言:javascript
复制
if(Auth::logged_in() && Auth::currentUser()->hasAllPermissions('read', 'write'))
    //user can read, and write

或者,如果您想要检查他们是否拥有某一组权限中的任何权限:

代码语言:javascript
复制
if(Auth::logged_in() && Auth::currentUser()->hasAnyPermissions('read', 'write'))
    //user can read, or write

当然,定义常量可能不是一个坏主意,比如PERMISSION_READ,您可以只将其定义为字符串'read',等等。

我发现这种方法比位掩码更容易阅读,因为方法名确切地告诉您它是什么。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1380045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档