あるファイルを扱う上で,あるソフトには次のような制約の設定があったとします。
| 設定項目 | Yes/No |
|---|---|
| 読み込みを許可 | Yes |
| 追加を許可 | Yes |
| 上書きを許可 | No |
| 削除を許可 | Yes |
こんな場合,フラグを使うと,これらの設定値を1つの整数で表すことができます。
あるビットの値が1ならば Yes,0ならば No と決めておき,各ビットを次のように割り当てたとします。
| 位 | 項目 |
|---|---|
| | 読み込みの許可(許可なら1/拒絶なら0) |
| | 追加の許可(許可なら1/拒絶なら0) |
| | 上書きの許可(許可なら1/拒絶なら0) |
| | 削除の許可(許可なら1/拒絶なら0) |
こうすると,例えば「読み込み,追加」の設定を Yes にしたときの設定値は,
となるし,
他にも「削除,上書き,読み込み」を Yes にしたならば,
となります。
でも,じゃぁどうやって,各項目が Yes かどうか確かめるのか。
これは,各ビットの AND(論理積)を求めれば良いわけです。
一応 AND演算(プログラミング言語では,しばしば & と表される)の真理値表を載せておくと,
| A | B | A & B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
ってなるので, 例えば2番目の例で「上書き」設定が Yes かどうか調べるには,
$conf = 13; if (0 !== ($conf & pow(2, 2))) echo "読み込みできます。"; else echo "読み込みできません!";
とかすると
| |
| |
| より |
| |
なので,調べられる。ちなみに,pow は って関数。
(コードでは !== という比較演算子を使ったけど,普通 0 は FALSE(偽) として扱われるので 0 !== は要らない…んだけど,
特にPHPの比較演算子については,一度キチンと押さえておくことをオススメします。知らないとデバッグで苦労するかも。)
おなじみの Unix系OSのファイルパーミッションは,755 とか 644 とかの8進数表記ですよね。 「所有者・グループ・その他ユーザー」という各ユーザークラスのパーミッションを,8進数の各桁の数字で表現しています。
それぞれの桁(つまりユーザークラス)で,
となるわけで,この組み合わせで通りのファイル操作権限を表現してるわけです。