Php 以二进制设置权限

Php 以二进制设置权限,php,Php,我在学校看到一个使用二进制字符串设置权限的系统 假设101001=41 因此: 1可以是第1页的权限 2可以是第2页的权限 4可以是第3页的权限 8可以是第4页的权限 16可以是第5页的权限 32可以是第6页的权限 假设我得到了上面的二进制字符串(101001)。我可以访问第1、4和6页 如何在PHP中实现这一点?假设我在MySQL中有一个名为perms的字段存储在12月,那么101001将是41我怎么知道41在PHP中等于1、8和32? 谢谢。这就是二进制的本质——每个数字只有一个1和0的

我在学校看到一个使用二进制字符串设置权限的系统

假设101001=41

因此:

  • 1可以是第1页的权限
  • 2可以是第2页的权限
  • 4可以是第3页的权限
  • 8可以是第4页的权限
  • 16可以是第5页的权限
  • 32可以是第6页的权限
假设我得到了上面的二进制字符串(101001)。我可以访问第1、4和6页

如何在PHP中实现这一点?假设我在MySQL中有一个名为
perms
的字段存储在12月,那么101001将是41我怎么知道41在PHP中等于1、8和32?


谢谢。

这就是二进制的本质——每个数字只有一个1和0的组合

PHP注释中的函数用于:

这将使
二进制数组

array(1, 8, 32);

您可以使用
&运算符
并对照这些标志进行检查

$READ = 8;
$WRITE = 1;
$EXECUTE = 32;
$permissions = 41;
if ($permissions & $READ) {
   // do smth
}
if ($permissions & $WRITE ) {
   // do smth
}
if ($permissions & $EXECUTE ) {
   // do smth
}

让我解释一下。如果你有比特1001(9)。您只需用1001检查第四位(1000)。只需将$permissions变量的每一位与位编号相乘即可。结果将是1000。它可以转换为
true
值。所以这里有国旗。如果检查第三位(0100),则结果为0000,为
false
值。所以您在这里没有权限。

这是一个很好的片段。从这里开始


因为它是二进制和十进制的,所以您可以使用和来回转换它。这只是一个不同的基数


编辑:按位操作很好,这样做^ ^

听起来像是在谈论位和按位运算符。最简单的设置方法是为每个权限定义常量

const POST   = 1;
const DELETE = 2;
const UPDATE = 4;
const READ   = 8;
一旦定义了这些,就可以很容易地使用位运算符进行比较:

$userValue = '1101';

if ($userValue & self::POST) {
  echo 'Can Post';
}

if ($userValue & self::DELETE) {
  echo 'Can Delete';
}

if ($userValue & self::UPDATE) {
  echo 'Can Update';
}

if ($userValue & self::READ) {
  echo 'Can Read';
}

这就是PHP自己的常量的工作方式。如果您曾经使用
E_ALL&E_DEPRECATED
之类的设置错误报告,那么实际上您正在使用二进制数

谢谢。我更喜欢使用常量而不是变量。非常感谢。我更喜欢常数,这就是我接受另一个的原因。
<?php
$read = 1;
$write = 2;
$readwrite = 16;
$local_admin = 32;
$global_admin = 64;

$jim = 96;
$mike = 16;

echo "Is Mike Allowed to edit? he has an access level of 16<BR>";
if ($mike & 32) {
    echo 'YES MIKE CAN EDIT';
} else {
    echo 'NO HE CANNOT';
}

echo "<BR><BR>Is Jim Allowed to edit? he has an access level of 96<BR>";
if ($jim & 32) {
    echo 'YES JIM CAN EDIT';
} else {
    echo 'NO HE CANNOT';
}
?>
const POST   = 1;
const DELETE = 2;
const UPDATE = 4;
const READ   = 8;
$userValue = '1101';

if ($userValue & self::POST) {
  echo 'Can Post';
}

if ($userValue & self::DELETE) {
  echo 'Can Delete';
}

if ($userValue & self::UPDATE) {
  echo 'Can Update';
}

if ($userValue & self::READ) {
  echo 'Can Read';
}