我正在使用PHP的用户角色/权限系统来编写脚本。
下面是使用位掩码方法获得phpbuilder.com权限的代码。
在该部分下面是一个简单得多的版本,w3hich可以在几乎没有该部分的情况下完成相同的操作。
许多人建议使用位运算符,例如PHP中的设置和其他内容,但我从来不明白为什么。在下面的代码中,使用第一个代码而不是第二个代码有什么 好处 ?
<?php /** * Correct the variables stored in array. * @param integer $mask Integer of the bit * @return array */ function bitMask($mask = 0) { $return = array(); while ($mask > 0) { for($i = 0, $n = 0; $i <= $mask; $i = 1 * pow(2, $n), $n++) { $end = $i; } $return[] = $end; $mask = $mask - $end; } sort($return); return $return; } define('PERMISSION_DENIED', 0); define('PERMISSION_READ', 1); define('PERMISSION_ADD', 2); define('PERMISSION_UPDATE', 4); define('PERMISSION_DELETE', 8); //run function // this value would be pulled from a user's setting mysql table $_ARR_permission = bitMask('5'); if(in_array(PERMISSION_READ, $_ARR_permission)) { echo 'Access granted.'; }else { echo 'Access denied.'; } ?>
非位版本
<?PHP /* NON bitwise method */ // this value would be pulled from a user's setting mysql table $user_permission_level = 4; if($user_permission_level === 4) { echo 'Access granted.'; }else { echo 'Access denied.'; } ?>
为什么不这样做呢?
define('PERMISSION_DENIED', 0); define('PERMISSION_READ', 1); define('PERMISSION_ADD', 2); define('PERMISSION_UPDATE', 4); define('PERMISSION_DELETE', 8); //run function // this value would be pulled from a user's setting mysql table $_ARR_permission = 5; if($_ARR_permission & PERMISSION_READ) { echo 'Access granted.'; }else { echo 'Access denied.'; }
如果您使用位,还可以创建许多权限的任意组合…
$read_only = PERMISSION_READ; $read_delete = PERMISSION_READ | PERMISSION_DELETE; $full_rights = PERMISSION_DENIED | PERMISSION_READ | PERMISSION_ADD | PERMISSION_UPDATE | PERMISSION_DELETE; //manipulating permissions is easy... $myrights = PERMISSION_READ; $myrights |= PERMISSION_UPDATE; // add Update permission to my rights