php 二进制位操作举例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/niedewang/article/details/84194117

php 二进制位操作举例


博客最近长草了,非常抱歉。最近家里和公司事情比较多,没有时间来管理博客。看了大家的评论,关于demo的事情,我会尽量早点的编写。

下面说正题,关于php的位操作。

对这一块我也不是非常的熟悉,不过最近要开发一个权限判度的功能。使用这个会很比较简单,我直接用例子来作说明。

一般正规开发公司,会有三到四套的环境,分别是

DEV:开发环境
TEST:测试环境
PRE:预发布环境
PRD:正是环境

如果我们要作一个权限控制。
比如某个程序只能在生产环境来运行。
某个程序可以在开发环境和测试环境。

那我们可以用二进制的位来设计,总共4个环境,用四个二进制数来表示就可以了。0表示没有权限,1表示有权限。
比如 ,从右到作

第一位,控制是否可以在测试环境运行,比如0001 ,表示可以在开发环境运行,0000,表示不可以在开发环境运行

第二位 控制是否可以在测试环境运行,比如0010 ,表示可以在测试环境运行,0000,表示不可以在测试 环境运行

第三位 控制是否可以在预发布环境运行,比如0100 ,表示可以在预发布环境运行,0000,表示不可以在预发布 环境运行

第四位 控制是否可以在生产环境运行,比如1000 ,表示可以在生产环境运行,0000,表示不可以在生产环境运行
。
。
1111:表示,在所有环境下运行,转换成10进制是 15
0000:表示所有环境都不可以运行,转换成10进制是 0
0011:表示测试和开发环境可以运行,预发布环境和生产环境不可以运行 转换成10进制是 3

进制转换参考网站
http://tool.oschina.net/hexconvert/

<?php
/**
 * 可以在测试可以开发环境运行
 * 二进制表示 0001 = 1
 */
const RUN_IN_DEV = 1;

/**
 * 可以在测试可以测试环境运行
 * 二进制表示 0010 = 2
 */
const RUN_IN_TEST = 2;

/**
 * 可以在测试可以预发布环境运行
 * 二进制表示 0100 = 4
 */
const RUN_IN_PRE = 4;

/**
 * 可以在测试可以预发布环境运行
 * 二进制表示 1000 = 8
 */
const RUN_IN_PRD = 8;

/**
 * 加入我们有一个程序权限需要设置位,可以在测试,开发,预发布环境来运行,但是进制在生产环境下炮
 *  对应的设置码位:0111  转换成10进制位 7
 *  
 */
$task1 = 7; //二进制  0111,只允许在开发和测试环境运行
//$task1 = 15; //二进制  1111,可以在所有环境下运行
//$task1 = 1; //二进制  0001,只能在开发环境运行
//$task1 = 0; //二进制  0000,所有环境都不能运行

//是否可以在开发环境运行
$currentEnv = '开发环境';
cheeck($task1, RUN_IN_DEV, $currentEnv);

//是否可以在测试环境运行
$currentEnv = '测试环境';
cheeck($task1, RUN_IN_TEST, $currentEnv);

//是否可以在测试环境运行
$currentEnv = '预发布环境';
cheeck($task1, RUN_IN_PRE, $currentEnv);

//是否可以在生产环境运行
$currentEnv = '生产环境';
cheeck($task1, RUN_IN_PRD, $currentEnv);


/**
 * 权限检测
 *
 * @param $task 权限设置
 * @param $env 当前的环境
 */
function cheeck($task, $env, $envName)
{
    //注意这里是一个& 符号
    if ($task & $env) {
        echo("可以在{$envName}环境下运行" . PHP_EOL);
    } else {
        echo("禁止在{$envName}环境下运行" . PHP_EOL);
    }
}

运行结果如下

/usr/bin/php /home/ndw/PhpstormProjects/test/bitOpDemo.php
可以在开发环境环境下运行
可以在测试环境环境下运行
可以在预发布环境环境下运行
禁止在生产环境环境下运行
Process finished with exit code 0

这样设置有什么优点呢:

  • 简洁容易扩展,如果要增加一套环境,只需要增加二进制的位数就可以了。如上例子,如果要调整上面的权限,可以在所有环境下运行,只需要改变 $task1= 15 就可以了。
  • 性能更高,只是位操作,对计算机来说运算量极小

缺点:

  • 位操作用的少,一般不怎么熟悉。代码阅读成本较高

猜你喜欢

转载自blog.csdn.net/niedewang/article/details/84194117