使用比较器,例如
if (admin) {do x}
else if (user) {do y}
这是一个坏主意,因为它不灵活并且不能很好地扩展。
有几个选项。如果您的权限是分层的,这意味着一个用户可以做任何事情,并且较低的用户比上面的用户拥有更少的权限,例如
admin - 1, 2, 3
accountant - 1, 2
user - 1
然后你可以给他们数字并说
if (permissionValue => 500)
{
action2();
}
并有一张桌子:
admin 1000
accountant 500
user 250
这允许您在管理员和会计师之间添加新的用户类型(例如版主),但如果您有以下情况,则无法使用:
admin 1, 2, 3
accountant 1, 2
moderator 1, 3
user 1
由于版主和会计的权限在同一级别。
到目前为止,最好的解决方案是使用按位运算符并将二进制值分配给您的保护区。
举一个简单的例子,用户可以读取内容,版主可以读取和写入内容,管理员可以读取、写入和删除内容。您将拥有下表(这些值是使用按位或运算符构造的)
Users: Read Write Delete
admin: 7 - (0b001 | 0b010 | 0b100) = 0b111 = 7
moderator: 3 - (0b001 | 0b010 | NO ) = 0b011 = 3
user: 1 - (0b001 | NO | NO ) = 0b001 = 1
然后你可以这样做:
//Permissions:
define('READ', 1);
define('WRITE', 2);
define('DELETE', 4);
if ($userPermissions & READ)
{
//Allowed to Read
}
if ($userPermissions & WRITE)
{
//Show write form
}
这些是按位运算符的示例。这意味着如果 x 包含位 y 返回 true。对于写功能
User Permission
User Write
1 & 2
0b001 & 0b010 -- returns false
Admin Write
7 & 2
0b111 & 0b010 -- returns true
在第一个示例中,0b001 不包含位 0b010,因此返回 false。0b111 确实包含位 0b010 并返回 true。
在这里阅读更多