Установка разрешений в двоичном формате

В школе я видел систему, устанавливающую разрешения с использованием двоичной строки.

Скажем, 101001 = 41

Так :

  • 1 может быть разрешено на стр. 1
  • 2 может быть разрешено на стр. 2
  • 4 может быть разрешено на стр. 3
  • 8 может быть разрешено на стр. 4
  • 16 может быть разрешено на стр. 5
  • 32 может быть разрешено на стр. 6

Итак, допустим, я получил двоичную строку выше (101001). У меня есть доступ к страницам 1, 4 и 6.

Как я могу это сделать в PHP? Предположим, я получил поле в MySQL с именем perms хранящимся в dec, поэтому 101001 будет 41. Как я могу узнать, что 41 равно 1, 8 и 32 в PHP?

Благодарю.

Похоже, вы говорите о битах и ​​побитых операторах. Этот самый простой способ установить это – определить константы для каждого разрешения

 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 вы фактически работаете с двоичными числами.

Вы можете использовать & operator и проверять эти флаги.

 $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). Вы просто проверяете бит (1000) на 1001. Вы просто умножаете EVERY бит переменной $ permissions и номером бита. Результат будет 1000. Он конвертируется в true значение. Итак, у вас есть флаг здесь. Если проверить третий бит (0100), это приведет к 0000, и это будет false значение. Таким образом, у вас нет прав.

Вот хороший фрагмент. взято здесь http://www.litfuel.net/tutorials/bitwise.htm

 <?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'; } ?> 

Такова природа двоичного кода – для каждого числа существует только одна комбинация единиц и нулей.

Функция из комментариев PHP для decbin :

 function bindecValues($decimal, $reverse=false, $inverse=false) { /* 1. This function takes a decimal, converts it to binary and returns the decimal values of each individual binary value (a 1) in the binary string. You can use larger decimal values if you pass them to the function as a string! 2. The second optional parameter reverses the output. 3. The third optional parameter inverses the binary string, eg 101 becomes 010. -- darkshad3 at yahoo dot com */ $bin = decbin($decimal); if ($inverse) { $bin = str_replace("0", "x", $bin); $bin = str_replace("1", "0", $bin); $bin = str_replace("x", "1", $bin); } $total = strlen($bin); $stock = array(); for ($i = 0; $i < $total; $i++) { if ($bin{$i} != 0) { $bin_2 = str_pad($bin{$i}, $total - $i, 0); array_push($stock, bindec($bin_2)); } } $reverse ? rsort($stock):sort($stock); return implode(", ", $stock); } 

Применение

 $binary_array = bindecValues(41); 

Это сделает binary_array :

 array(1, 8, 32); 

Поскольку он является двоичным и десятичным, вы можете преобразовать его обратно и вперед с помощью decbin и bindec . Это просто отличная база для …

EDIT: побитовое сладкое, сделайте это ^ _ ^