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

我正在为脚本开发PHP中的用户角色/权限系统。

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

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

许多人建议在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.';
}

?>

为什么不只是这样做...

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

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

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

例如,二进制序列10010将识别具有PERMISSION_DELETEPERMISSION_READ的用户(识别PERMISSION_READ的位是用于2的列,识别PERMISSION_DELETE的位是用于16的列),二进制10010是十进制的18(16 + 2 = 18 )。 你的第二个代码示例不允许你做这种测试。 您可以做更大的风格检查,但假设每个使用PERMISSION_DELETE人都应该拥有PERMISSION_UPDATE ,这可能不是有效的假设。


也许这只是因为我经常没有使用位掩码,但是我发现在像PHP这样的语言中,开发人员的生产力和代码可读性比速度或内存使用更重要(显然在限制内),没有真正的理由使用位掩码。

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

if(Auth::logged_in() && Auth::currentUser()->hasPermission('read'))
    //user can read

那么如果你想检查他们是否有权限的组合:

if(Auth::logged_in() && Auth::currentUser()->hasAllPermissions('read', 'write'))
    //user can read, and write

或者如果你想检查他们是否有任何一组特权:

if(Auth::logged_in() && Auth::currentUser()->hasAnyPermissions('read', 'write'))
    //user can read, or write

当然,定义常量(例如PERMISSION_READ,您可以将其定义为字符串“read”等)可能不是一个好主意。

我发现这种方法比位掩码更容易阅读,因为方法名称告诉你到底是你在找什么。

链接地址: http://www.djcxy.com/p/57599.html

上一篇: Why should I use bitwise/bitmask in PHP?

下一篇: PHP different usage of reference sign &