PHP位运算与或异或 - Go语言中文社区

PHP位运算与或异或


应用场景:
你是否遇到过这样的问题?我现在有个功能有很多权限控制,但是我不能使用很多字段用1,0来存储这么多权限,这样做感觉太low了,而且判断起来需要用到很多字段,维护起来好麻烦,后期如果再新增其他权限还需要新增字段。

下面用一个简单的小技巧告别这种不科学和反人类的设计吧!

这里只需要用到几个php的位运算,参照php官方文档
在这里插入图片描述
所以我们只需要用一个十进制数字来存储这些权限即可,十进制转换为二进制后的每一位都代表一个权限,为1则有权限,为0则无权限。
show me the code!

<?php
	$write = 2; // 写权限用2表示
	$read = 4;  // 读权限用4表示
	$high = 8;  // 最高权限用8表示
	// 还可以根据需求定义更多的权限,但注意必须为2的指数
	$audit_type = 0; 初始化权限值,0则是所有多没有权限
	// 我想给一个人加个写权限
	$audit_type = $audit_type | $write;
	// 再加个读权限和最高权限
	$audit_type = $audit_type | $read | $high;
	// 判断一下是否加上了呢
	if (($audit_type & $write) != 0) {
		echo "i have write level";
	}
	if (($audit_type & $read) != 0) {
		echo "i have read level";
	}
	// 我想去掉写权限
	$audit_type = $audit_type ^ $write;
	if (($audit_type & $write) != 0) {
		echo "i have write level";
	} else {
		echo "i don't have write level";
	}

这样就可以通过一个字段来实现多个权限的控制啦!

例如audit_type为14
二进制:1 1 1 0
write二进制:0 0 1 0
read二进制:0 1 0 0
high二进制:1 0 0 0
audit_type & write 的时候就得到二进制 0 0 1 0,十进制2
audit_type & read 的时候就得到二进制 0 1 0 0,十进制4
audit_type & high 的时候就得到二进制 1 0 0 0,十进制8
audit_type ^ write 的时候就得到二进制 1 1 0 0,可以看到这样做就会把write的位置为0,也就是取消了权限,同理可以取消其他权限
audit_type为0想加权限
audit_type | write 的时候就得到二进制 0 0 1 0,十进制2
audit_type | write | read 等

总结:
只要定义好各个权限的数值就可以通过下面的操作来进行权限控制了
使用或 | 来加权限
使用与 & 来判断权限
使用异或 ^ 来去除权限

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/sinat_21125451/article/details/88826521
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-28 19:59:18
  • 阅读 ( 1456 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢