为什么要在PHP中使用按位/掩码? [英] Why should I use bitwise/bitmask in PHP?

查看:304
本文介绍了为什么要在PHP中使用按位/掩码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的用户角色/许可系统上的PHP脚本。

下面是一个使用位掩码方法,我发现在phpbuilder.com权限的code。

下面的部分是一个简单得多的版本w3hich可以做basicly同样的事情,没有小角色。

很多人都使用位运算符和等为PHP设置和其他东西推荐的,我永远无法理解为什么虽然。在code以下是有使用第一code而不是第二的任何益处

 < PHP
/ **
 *修正存储在阵列中的变量。
 * @参数$整数位掩码整数
 * @返回数组
 * /
功能位掩码($面膜= 0){
    $收益率=阵列();
    而($面具大于0){
        为($ i = 0,$ N = 0; $ I< = $面具; $ I = 1 * POW(2,$ N),$ N ++){
            $结束= $ I;
        }
        $返回[] = $结束;
        $面膜= $面具 - $结束;
    }
    排序($返程);
    返回$返回;
}
定义('PERMISSION_DENIED',0);
定义('PERMISSION_READ',1);
定义('PERMISSION_ADD',2);
定义('PERMISSION_UPDATE',4);
定义('PERMISSION_DELETE',8);//运行功能
//这个值会从用户的设置MySQL表拉
$ _ARR_permission =掩码('5');如果(in_array(PERMISSION_READ,$ _ARR_permission)){
    回声访问理所当然的。;
}其他{
    回声访问被拒绝。;
}
?>

非位版本的

 < PHP
/ *
   非按位法
* ///这个值会从用户的设置MySQL表拉
$ user_permission_level = 4;如果($ user_permission_level === 4){
    回声访问理所当然的。;
}其他{
    回声访问被拒绝。;
}?>


解决方案

为什么不这样做?

 定义('PERMISSION_DENIED',0);
定义('PERMISSION_READ',1);
定义('PERMISSION_ADD',2);
定义('PERMISSION_UPDATE',4);
定义('PERMISSION_DELETE',8);//运行功能
//这个值会从用户的设置MySQL表拉
$ _ARR_permission = 5;如果($ _ ARR_permission&安培; PERMISSION_READ){
    回声访问理所当然的。;
}其他{
    回声访问被拒绝。;
}

您还可以创建很多,如果你使用的位...

权限任意组合

  $ READ_ONLY = PERMISSION_READ;
$ read_delete = PERMISSION_READ | PERMISSION_DELETE;
$ full_rights = PERMISSION_DENIED | PERMISSION_READ | PERMISSION_ADD | PERMISSION_UPDATE | PERMISSION_DELETE;//操作权限是很容易...
$ myrights = PERMISSION_READ;
$ myrights | = PERMISSION_UPDATE; //添加更新允许我的权利

I am working on a user-role / permission system in PHP for a script.

Below is a code using a bitmask method for permissions that I found on phpbuilder.com.

Below that part is a much simpler version w3hich could do basicly the same thing without the bit part.

Many people have recommended using bit operators and such for settings and other things in PHP, I have never understood why though. In the code below is there ANY benefit from using the first code instead of the second?

<?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.';
}
?>

non-bit version

<?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.';
}

?>

解决方案

Why not just do this...

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.';
}

You can also create lots of arbitrary combinations of permissions if you use bits...

$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

这篇关于为什么要在PHP中使用按位/掩码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆