PHP使用位运算符控制权限

位运算符在实际应用中可以做用户权限的应用

我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符、| 位或运行符。参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出。

它的权限值是这样的

2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)

2^1=2,相应2进数为”0010″
2^2=4,相应2进数为”0100″
2^3=8,相应2进数为”1000″

要判断一个数在某些数范围内就可以使用 & 运算符(数值从上面的表中得来)

如:7=4|2|1 (你也可以简单理解成7=4+2+1)

用 & 来操作,可以知道7&4、7&2、7&1都是真的,而如果7&8则是假的

&、| 不熟悉的就要去查查手册,看看是怎么用的了

下面来看例子吧:

$perArr = array(
            'read' => 1<<0,//2^0
            'write' => 1<<1,//2^1
            'excute' => 1<<2,//2^2
            'delete' => 1<<3,//2^3
            'manage' => 1<<4,//2^4
        );
        $str = $perArr['read'] | $perArr['write'];// 3 = 1 + 2
        // echo $str |  $perArr['excute'];die;
        $manageMark = $perArr['read'] | $perArr['write'] | $perArr['excute'] | $perArr['delete'];
        $adminMark = $perArr['read'] | $perArr['write'] | $perArr['excute'] | $perArr['delete'] | $perArr['manage'];
        //总权限
        $mark = 0;
        foreach ($perArr as $m){
            $mark = $mark | $m;
        }
        echo $mark;//31//根据权限位 获取当前权限信息
        $arr = [];
        foreach ($perArr as $key=>$mark){
            if($manageMark & $mark){
                $arr[] = $key;
            }
        }
     $arr = array(
      'read','write','excute','delete'
    );

OK,权限分值的这其中一个算法就是这样的,可以说是简单高效。也不知大家明白没有,不明白也没关系,记住例子就行了。前提就是做好权限值的分布,即那个1、2、4、8、16….(这里还有个顺序问题,越高级的权限就要越高的权限值,比如上面的例子所演示的删除权限)。有了权限分布表就可以确定给某个人什么权限了,你简单的理解成要哪个权限就加上相应的权限值吧。

这个方法很好用的,缺点就是如果权限分布得细的话,那么权限值会越来越大,你自己想想,2的几次方、如果所有的权限都要则是全部相加。不过对于一般的权限来说这个已经足够了。

参考链接:https://www.php.cn/php-weizijiaocheng-369689.html

原文地址:https://www.cnblogs.com/guliang/p/12525319.html