当前位置:首页 > 技术文档 > 正文内容

关于&^|运算符应用于权限设置方面 php

admin7年前 (2018-09-14)技术文档1659

位运算符

位运算符允许对整型数中指定的位进行求值和操作。

例子名称结果
$a & $bAnd(按位与)将把 $a 和 $b 中都为 1 的位设为 1。
$a | $bOr(按位或)将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $bXor(按位异或)将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $aNot(按位取反)将 $a 中为 0 的位设为 1,反之亦然。
$a << $bShift left(左移)将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $bShift right(右移)将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。

运算符有的人会说了,用在php中有什么好处,为什么这里要用位运算

那么当我们设定了权限之后,假如要判断某个权限是不是包含另一个权限,这个时候,位运算有很有用,接下来我们看个例子:


首先,设定好权限的值

/** * This file defines common constants used in ownCloud */
namespace OCP;
/** 
 * CRUDS permissions. 
 */
const PERMISSION_CREATE = 4;
const PERMISSION_READ = 1;
const PERMISSION_UPDATE = 2;
const PERMISSION_DELETE = 8;
const PERMISSION_SHARE = 16;
const PERMISSION_GROUP=32;
const PERMISSION_TEAM=64;
const PERMISSION_ALL = 127;



假如$currentPermission = 7;//转换为二进制即:              0000 0000 0000 0111

而\OCP\PERMISSION_CREATE = 4;//转换为二进制即:0000 0000 0000 0100

\OCP\

假如我们要实现判断当有创建的权限的时候,给它将创建的权限去掉,就可以这样写:

if($currentPermission & \OCP\PERMISSION_CREATE){
   $currentPermission = $currentPermission ^ \OCP\PERMISSION_CREATE;
}


7&4 = 0000 0000 0000 0100//等于4


7^4 = 0000 0000 0000 0011//等于3

这样就剔除了创建的权限 ,同样当$currentPermission不包括某个权限的时候给他加上某个权限

if(!($currentPermission & \OCP\PERMISSION_DELETE)){
   $currentPermission = $currentPermission | \OCP\PERMISSION_DELETE;
}

7转换为二进制为:0000 0000 0000 0111


8转换为二进制为:0000 0000 0000 1000

7 & 8 = 0000 0000 0000 0000//值为0即false

7 | 8 =  0000 0000 0000 1111//值为15

此时$currentPermission = 7 | 8 = 15

这样就实现了权限的相加


总结:其实在我看来位运算主要就是起到了一个对权限是否存在的判断,这一点用在这里再好不过。当然权限的定义也是有一定规范的,都是2的指数倍。


转载自:https://blog.csdn.net/m0_37865231/article/details/75516193

分享到:

扫描二维码推送至手机访问。

版权声明:本文由云河空间发布,如需转载请注明出处。

本文链接:https://yuyunhe.cn/index.php/post/285.html

分享给朋友:

“ 关于&^|运算符应用于权限设置方面 php” 的相关文章

php获取从百度搜索进入网站的关键词

<?php    function search_word_from() {     $referer = isset($_SERVER['HTTP_REFERER'])?...

thinkphp获取URL参数

一般情况下URL中的参数就是通过GET方法获取,但是由于PATHINFO的特 殊性,URL地址最终需要被解析才能转换成GET参数,ThinkPHP对URL是按照一定的规则进行解析的,除非你使用了URL路由规则,如果你对 URL做了特别的定制,但是又不想使用URL路由,那么可以使用框架提供的URL...

ThinkPHP分页的实现

分页类需要和查询相结合,我们可以使用ThinkPHP自带的limit方法或者page方法,目的就是为了获取当前分页的数据(也有先获取完整数据然后前端分页显示的方法,不在本文描述内容中,也不建议)。使用limit方法或者page方法是和数据库类型无关的。我们首先在数据库里面创建一个think_data...

wamp虚拟主机配置

1、首先打开apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#,启用虚拟主机功能2、先把localhost配置好,免得以后访问localhost出现问题,我的wamp项目根目录是D:\wamp\www。将下面信息添加到...

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?先上代码进行java时间转换成unix timestampimport java.text.DateFormat;   import java.text.ParseExceptio...

PHP数组和Json之间的转换

        之所以要用到Json,很多时候是因为使用ajax对象时,程序与JS函数之间的数据交互。因为JS不认识PHP中的数组,PHP也不认识JS中的数组或对象。Json很好的解决了这个问题。Json简介  ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。