Bitmask在PHP中进行设置?

前端之家收集整理的这篇文章主要介绍了Bitmask在PHP中进行设置?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
位和位掩码是我一直在努力理解一段时间的东西,但是我想学习如何使用它们进行 PHP中的设置和设置.

我终于找到了一个声称要这样做的课程,我可以告诉我,这似乎是有效的,但我不知道这是否是最好的方法.我将以下面的示例代码发布类文件,以便正常运行.

请,如果你有经验,告诉我是否可以改进,性能或任何其他.我真的想学习这个,我一直在阅读,但是对我来说这是一个困难的事情.

班上…

  1. <?PHP
  2. class bitmask
  3. {
  4. /**
  5. * This array is used to represent the users permission in usable format.
  6. *
  7. * You can change remove or add valuesto suit your needs.
  8. * Just ensure that each element defaults to false. Once you have started storing
  9. * users permsisions a change to the order of this array will cause the
  10. * permissions to be incorectly interpreted.
  11. *
  12. * @type Associtive array
  13. */
  14. public $permissions = array(
  15. "read" => false,"write" => false,"delete" => false,"change_permissions" => false,"admin" => false
  16. );
  17.  
  18. /**
  19. * This function will use an integer bitmask (as created by toBitmask())
  20. * to populate the class vaiable
  21. * $this->permissions with the users permissions as boolean values.
  22. * @param int $bitmask an integer representation of the users permisions.
  23. * This integer is created by toBitmask();
  24. *
  25. * @return an associatve array with the users permissions.
  26. */
  27. public function getPermissions($bitMask = 0)
  28. {
  29. $i = 0;
  30. foreach ($this->permissions as $key => $value)
  31. {
  32. $this->permissions[$key] = (($bitMask & pow(2,$i)) != 0) ? true : false;
  33.  
  34. // Uncomment the next line if you would like to see what is happening.
  35. //echo $key . " i= ".strval($i)." power=" . strval(pow(2,$i)). "bitwise & = " . strval($bitMask & pow(2,$i))."<br>";
  36. $i++;
  37. }
  38. return $this->permissions;
  39. }
  40.  
  41. /**
  42. * This function will create and return and integer bitmask based on the permission values set in
  43. * the class variable $permissions. To use you would want to set the fields in $permissions to true for the permissions you want to grant.
  44. * Then call toBitmask() and store the integer value. Later you can pass that integer into getPermissions() to convert it back to an assoicative
  45. * array.
  46. *
  47. * @return int an integer bitmask represeting the users permission set.
  48. */
  49. function toBitmask()
  50. {
  51. $bitmask = 0;
  52. $i = 0;
  53. foreach ($this->permissions as $key => $value)
  54. {
  55.  
  56. if ($value)
  57. {
  58. $bitmask += pow(2,$i);
  59. }
  60. $i++;
  61. }
  62. return $bitmask;
  63. }
  64. }
  65. ?>

如何将权限设置/保存为位掩码值?

  1. <?PHP
  2. /**
  3. * Example usage
  4. * initiate new bitmask object
  5. */
  6. $perms = new bitmask();
  7.  
  8. /**
  9. * How to set permissions for a user
  10. */
  11. $perms->permissions["read"] = true;
  12. $perms->permissions["write"] = true;
  13. $perms->permissions["delete"] = true;
  14. $perms->permissions["change_permissions"] = true;
  15. $perms->permissions["admin"] = false;
  16.  
  17. // Converts to bitmask value to store in database or wherever
  18. $bitmask = $perms->toBitmask(); //in this example it is 15
  19. $sql = "insert into user_permissions (userid,permission) values(1,$bitmask)";
  20. echo $sql; //you would then execute code to insert your sql.
  21. ?>

使用位掩码值并根据位值返回每个数组项的true / false的示例….

  1. <?PHP
  2. /**
  3. * Example usage to get the bitmask value from database or session/cache.... then put it to use.
  4. * $permarr returns an array with true/false for each array value based on the bit value
  5. */
  6. $permarr = $perms->getPermissions($bitmask);
  7.  
  8. if ($permarr["read"])
  9. {
  10. echo 'user can read: <font color="green">TRUE</font>';
  11. }
  12. else {
  13. echo 'user can read: <font color="red">FALSE</font>';
  14. }
  15.  
  16. //user can WRITE permission
  17. if ($permarr["write"])
  18. {
  19. echo '<br>user can write: <font color="green">TRUE</font>';
  20. }
  21. else {
  22. echo '<br>user can write: <font color="red">FALSE</font>';
  23. }
  24. ?>
位字段是处理标志或一组布尔值的非常方便和有效的工具.

要了解他们,您首先需要知道二进制数字的工作原理.之后,您应该查看bitwise operators上的手册条目,并确保您知道按位AND,OR和左/右移位是如何工作的.

一个位字段只不过是一个整数值.我们假设我们的位字段的大小是固定的,只有一个字节.电脑使用二进制数字,所以如果我们的号码是29,你会在内存中找到0001 1101.

使用按位AND(&)和按位OR(|),您可以读出并单独设置数字的每一位.它们都以两个整数作为输入,并分别对每个位执行AND / OR.

要读出你的号码的第一位,你可以这样做:

  1. 0001 1101 (=29,our number)
  2. & 0000 0001 (=1,bit mask)
  3. = 0000 0001 (=1,result)

正如你所看到的,你需要一个特殊的数字,只有我们感兴趣的位被设置,这就是所谓的“位掩码”.在我们的例子中,它是1.要读出第二个位,我们必须将位图中的一个“push”到左边一位.我们可以用左移位运算符($number <1)或乘以2来做到这一点.

  1. 0001 1101
  2. & 0000 0010
  3. = 0000 0000 (=0,result)

你可以为我们号码中的每一位做到这一点.我们的数字和位掩码的二进制AND导致零,这意味着该位不是“置位”,或者是非零整数,这意味着该位被置位.

如果要设置其中一个位,可以使用按位OR:

  1. 0001 1101
  2. | 0010 0000 (=32,bit mask)
  3. = 0011 1101 (=29+32)

但是,当你想要“清除”一点时,你必须采取不同的方式.

更一般的做法是:

  1. // To get bit n
  2. $bit_n = ($number & (1 << $n)) != 0
  3. // Alternative
  4. $bit_n = ($number & (1 << $n)) >> $n
  5.  
  6. // Set bit n of number to new_bit
  7. $number = ($number & ~(1 << $n)) | ($new_bit << $n)

起初它可能看起来有点神秘,但其实很简单.

到目前为止,你可能会发现,比特字段是一个很低级的技术.这就是为什么我建议不要在PHP数据库中使用它们.如果你想要一堆标志,这可能是确定的,但是对于其他任何你真正不需要的标志.

你发布的课程对我来说有点特别.例如,像…的东西?真的:假的是糟糕的做法.如果你想使用位字段,你最好定义一些常量,并使用上面描述的方法.提出一个简单的课不难.

  1. define('PERM_READ',0);
  2. define('PERM_WRITE',1);
  3.  
  4. class BitField {
  5. private $value;
  6.  
  7. public function __construct($value=0) {
  8. $this->value = $value;
  9. }
  10.  
  11. public function getValue() {
  12. return $this->value;
  13. }
  14.  
  15. public function get($n) {
  16. return ($this->value & (1 << $n)) != 0;
  17. }
  18.  
  19. public function set($n,$new=true) {
  20. $this->value = ($this->value & ~(1 << $n)) | ($new << $n);
  21. }
  22. public function clear($n) {
  23. $this->set($n,false);
  24. }
  25. }
  26.  
  27.  
  28. $bf = new BitField($user->permissions);
  29.  
  30. if ($bf->get(PERM_READ)) {
  31. // can read
  32. }
  33.  
  34. $bf->set(PERM_WRITE,true);
  35. $user->permissions = $bf->getValue();
  36. $user->save();

我没有尝试任何这个答案的代码,但它应该让你开始,即使它不是开箱即用.

请注意,您每位字段限制为32个值.

猜你在找的PHP相关文章