Concernant les opérations sur les bits des nombres binaires, les trois opérations les plus courantes sont "OR, AND et NOT". Bien entendu, le manuel PHP inclut également "XOR, These". trois opérations sont "le décalage à gauche et le décalage à droite".
Comment définir les autorisations
Définir la valeur des autorisations selon 2 à la Nième puissance, et ainsi de suite. Pourquoi le définir ainsi ? Cette définition garantit qu'il n'y a qu'un seul 1 dans chaque valeur d'autorisation (binaire) et qu'elle correspond exactement à une autorisation. Par exemple :
define('ADD', 1); // 增加权限 define('UPD', 2); // 修改权限 define('SEL', 4); // 查找权限 define('DEL', 8); // 删除权限
Opération d'autorisation
L'opération d'autorisation implique en fait la notion de « rôle ». Effectuer des opérations d'autorisation n'est rien d'autre que d'accorder certaines autorisations à un certain rôle, d'interdire certaines autorisations et de détecter si un certain rôle dispose de certaines autorisations. Par rapport à ces trois opérations. Il peut être facilement mis en œuvre à l’aide d’opérations arithmétiques entre nombres binaires.
// 给予某种权限用到“位或”运算符 $a_access = ADD | UPD | SEL | DEL; // a拥有增删改查权限 $b_access = ADD | UPD | SEL; // b拥有增改查权限 $c_access = ADD | UPD; // c拥有增改权限 // 禁止某种权限用“位与”和“位非”运算符 $d_access = $c_access & ~UPD; // d只拥有了增权限 // 检测是否拥有某种权限用到“位与”运算符 var_dump($b_access & ADD); // 1代表b拥有增权限 var_dump($b_access & DEL); // 0代表b不拥有删权限
Implémentation de classes d'autorisation et de classes de rôle simples
En utilisant la méthode d'opération d'autorisation ci-dessus, elle peut être simplement encapsulée dans une classe d'autorisation et une classe de rôle.
<?php /** * 简单权限类 */ class Peak_Auth { /** * 权限类计数器 * 作用在于生成权限值 * * @var int */ protected static $authCount = 0; /** * 权限名称 * * @var string */ protected $authName; /** * 权限详细信息 * * @var string */ protected $authMessage; /** * 权限值 * * @var int 2的N次方 */ protected $authValue; /** * 构造函数 * 初始化权限名称、权限详细信息以及权限值 * * @param string $authName 权限名称 * @param string $authMessage 权限详细信息 */ public function construct($authName, $authMessage = '') { $this->authName = $authName; $this->authMessage = $authMessage; $this->authValue = 1 << self::$authCount; self::$authCount++; } /** * 本类不允许对象复制操作 */ private function clone() { } /** * 设置权限详细信息 * * @param string $authMessage */ public function setAuthMessage($authMessage) { $this->authMessage = $authMessage; } /** * 获取权限名称 * * @return string */ public function getAuthName() { return $this->authName; } /** * 获取权限值 * * @return int */ public function getAuthValue() { return $this->authValue; } /** * 获取权限详细信息 * * @return string */ public function getAuthMessage() { return $this->authMessage; } } /** * 简单角色类 * * @author 27_Man */ class Peak_Role { /** * 角色名 * * @var string */ protected $roleName; /** * 角色拥有的权限值 * * @var int */ protected $authValue; /** * 父角色对象 * * @var Peak_Role */ protected $parentRole; /** * 构造函数 * * @param string $roleName 角色名 * @param Peak_Role $parentRole 父角色对象 */ public function construct($roleName, Peak_Role $parentRole = null) { $this->roleName = $roleName; $this->authValue = 0; if ($parentRole) { $this->parentRole = $parentRole; $this->authValue = $parentRole->getAuthValue(); } } /** * 获取父角色的权限 */ protected function fetchParenAuthValue() { if ($this->parentRole) { $this->authValue |= $this->parentRole->getAuthValue(); } } /** * 给予某种权限 * * @param Peak_Auth $auth * @return Peak_Role 以便链式操作 */ public function allow(Peak_Auth $auth) { $this->fetchParenAuthValue(); $this->authValue |= $auth->getAuthValue(); return $this; } /** * 阻止某种权限 * * @param Peak_Auth $auth * @return Peak_Role 以便链式操作 */ public function deny(Peak_Auth $auth) { $this->fetchParenAuthValue(); $this->authValue &= ~$auth->getAuthValue(); return $this; } /** * 检测是否拥有某种权限 * * @param Peak_Auth $auth * @return boolean */ public function checkAuth(Peak_Auth $auth) { return $this->authValue & $auth->getAuthValue(); } /** * 获取角色的权限值 * * @return int */ public function getAuthValue() { return $this->authValue; } } ?>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!