二进制交叉权限微型php类分享

这篇文章主要介绍了二进制交叉权限微型php类,需要的朋友可以参考下

靓点:

1、多对多交叉场景分配;

2、php新特性-闭包使用、批处理函数array_walk/array_flip使用;

3、位运算&使用案例;

使用场景:

1、常见增删改查(2的N次方值入库);

2、认证、第三方账号绑定、多分类选择;

代码如下:

  1. <?php
  2. class s_allow{
  3. //声明使用场景,任务清单
  4. public $scene,$case_list=array();
  5. //声明指定用户角色、允许值、允许清单
  6. public $allow_value=0,$allow_list=array();
  7. //初始化场景、角色
  8. function __construct($scene,$allow_value=0){
  9. $this->scene=$scene;
  10. $this->case_list=$this->case_list(true);
  11. if ($allow_value) {
  12. $this->allow_value=$allow_value;
  13. $this->allow_list=$this->allow_list($allow_value,true);
  14. }
  15. }
  16. //取得全部任务清单
  17. function case_list($mode=false){
  18. $case_list=config($this->scene,'allow');
  19. return $mode ? $case_list : array_keys($case_list);
  20. }
  21. //取得用户任务清单
  22. function allow_list($allow_value=0,$mode=false){
  23. $buffer=array();
  24. foreach ($this->case_list as $key=>$value) {
  25. if ($allow_value & pow(2,$key-1)) {
  26. $buffer[$key]=$value;
  27. }
  28. }
  29. return $mode ? $buffer : array_keys($buffer);
  30. }
  31. //计算允许值
  32. function allow_value($allow_list=null){
  33. if ($allow_list==null) $allow_list=$this->allow_list;
  34. array_walk($allow_list, function($value,$key) use(&$allow_list){
  35. $allow_list[$key]=pow(2,$value-1);
  36. });
  37. return array_sum($allow_list);
  38. }
  39. //判断是否允许
  40. function is_allow($case){
  41. $case_list=array_flip($this->case_list);
  42. return (bool)($this->allow_value & pow(2,$case_list[$case]-1));
  43. }
  44. }

代码如下:

  1. [access]
  2. 1=add
  3. 2=del
  4. 3=read
  5. 4=list
  6. 5=mod
  7. 6=detail
  8. 7=pub
  9. 8=collect
  10. 9=like
  11. 10=send
  12. [cert]
  13. 1=email
  14. 2=tel
  15. 3=qq
  16. 4=identity_card
  17. 5=real_name
  18. 6=business_license
  19. [bind]
  20. 1=qq
  21. 2=weibo
  22. 3=taobao
  23. 4=alipay
  24. 5=renren
  25. 6=weichat
  26. 7=baidu