原理
在Linux文件系統中,一個用戶對文件或目錄所擁有的權限分為三種:”可讀”、”可寫”和”可執行”,分別用 1 、2 和 4 來表示,它們之間可以任意組合:有“可讀”、“可寫”權限就用 3 來表示(1 + 2 = 3);有”可讀“、”可執行“權限就用5來表示(1 + 4 = 5),三種權限全部擁有就用 7 表示(1 + 2 + 4 = 7)。
?
實際上,這種運算是基于二進制的。假設可執行、可寫、可讀三種權限分別對應三個狀態位,如果用戶具有某種權限,那么將對應的狀態位標識為“1”,反之則標識為“0”。如圖:
?
如果只有“可讀”權限,那么就對應二進制數:001,將這個二進制數轉成十進制就得到1;如果同時具有“可讀”、“可寫”權限,二進制數則對應為: 011,轉十進制得:3;同理,三種權限都有的,十進制就等于7。
?
實現
在PHP中,通過 位運算符 很容易就可以做到類似的權限控制:
<?php //定義權限 define('READ', 1<< 0); // 把可讀權限放在最右邊 define('WRITE', 1<<1); // 可讀權限向左移一位 define('EXCUTE', 1<<2); // 可執行權限向左移兩位 //賦予權限 $user_permission = READ | WRITE; //驗證權限 echo '可讀:', ($user_permission & READ) ? 'Yes' : 'No', "\n"; echo '可寫:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n"; echo '可執行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n"; ?>?
PHP語言本身的 錯誤控制 也是用位運算來做的,它甚至還利用了 按位異或 和 按位非 ,使得錯誤控制更加精確。
?
優點和缺陷
位運算的運算對象是二進制的位,速度快,效率高,而且節省存儲空間,位運算做權限控制又相當地靈活。但是,位運算也有很大的局限,因為在32位計算機上,位移不能超過32次,這就要求權限數量不超過32種。
?
來源: http://xiaobin.net/200906/bitwise-permission/
?
?
位運算 就是把數值轉化成二進制數來進行運算,常用的位運算符詳下表:
?
位運算符 例子 名稱 結果$a & $b | And(按位與) | 將把 $a 和 $b 中都為 1 的位設為 1。 |
$a | $b | Or(按位或) | 將把 $a 或者 $b 中為 1 的位設為 1。 |
$a ^ $b | Xor(按位異或) | 將把 $a 和 $b 中不同的位設為 1。 |
~ $a | Not(按位非) | 將 $a 中為 0 的位設為 1,反之亦然。 |
$a << $b | Shift left(左移) | 將 $a 中的位向左移動 $b 次(每一次移動都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 將 $a 中的位向右移動 $b 次(每一次移動都表示“除以 2”)。 |
?
<?php $a=12; /* 轉化為二進制數為1100 */ $b=9; /* 轉化為二進制數為1001 */ $c=2; echo "a=$a b=$b c=$c"; echo "<br>$a & $b ="; echo $a & $b; echo "<br>$a | $b ="; echo $a | $b; echo "<br>$a<<$c="; echo $a<<$c; ?>
?
預覽:
?
ps:用十進制數除以2得余數,繼續除每次都是取余數,所得的是從低位到高位的二進制數。
如:12/2=6 (余數0) 6/2=3(余數0) 3/2=1(余數1) 1/2=1(余數1)
即:1100。
二進制轉換成十進制,分別用每一位的數字×對應的2的不同次冪。
1100即 2 0 x0+2 1 x0+2 2 x1=2 3 x1=12
?
來源: http://www.web589.com/posts/575.html
?
原理: 將每個二進制位為一個權限標識位
- 增加權限使用 | (無論存在與否, 將對應的權限位置1)
- 刪除權限使用 ^ 或 & ~ (無論存在與否, 將對應的權限位置0)
- 判斷權限使用 & ? (使用與判斷對應的權限位是否為1, 是, 返回非0; 不是, 返回0)
<?php define("PUBLIC_ARTICLE", 1); //發行文章 define("CREATE_ARTICLE", 2); //添加文章 define("MODIFY_ARTICLE", 4); //修改文章 define("DELETE_ARTICLE", 8); //刪除文章 define("SHARCH_ARTICLE", 16); //搜索文章 define("CREATE_COMMENT", 32); //添加文章評論 define("DELETE_COMMENT", 64); //刪除文章評論 //所有的權限 $final_allow = PUBLIC_ARTICLE | CREATE_ARTICLE | MODIFY_ARTICLE | DELETE_ARTICLE | SHARCH_ARTICLE | CREATE_COMMENT | DELETE_COMMENT; echo "管理者擁有的全部權限:" .decbin($final_allow). "<br>"; $no_shearch_allow = $final_allow ^ SHARCH_ARTICLE; echo "僅無法搜索文章的權限:" .decbin($no_shearch_allow). "<br>"; //編輯人員獨有的權限 $editor_allow = PUBLIC_ARTICLE | MODIFY_ARTICLE | DELETE_ARTICLE; $no_editor_allow = $final_allow & ~$editor_allow; echo "非編輯人員所有的權限:" .decbin($no_editor_allow). "<br>"; ?>?
最終輸出為:
管理者擁有的全部權限:1111111
僅無法搜索文章的權限:1101111
非編輯人員所有的權限:1110010
?
另外可以參看:
<?php echo $uu=array_sum($_POST[gr]); ?> <form action="" method="POST"> ADD <input type="checkbox" name=gr[] value=1 <?php echo $uu&1? "checked":null;?>> UPD <input type="checkbox" name=gr[] value=2 <?php echo $uu&2? "checked":null;?>> LIS <input type="checkbox" name=gr[] value=4 <?php echo $uu&4? "checked":null;?>> DEL <input type="checkbox" name=gr[] value=8 <?php echo $uu&8? "checked":null;?>> <input type="submit" value="提交"> </form> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
